Moderators NEFERPITOU Postat Decembrie 25, 2024 Moderators Postat Decembrie 25, 2024 ** Obiective ** Prezentare & Implementare Functii Prieten ; Prezentare & Implementare Clase Prieten . ** Functii Prieten ** Functiile prieten reprezinta un concept strict C++ (nemaiintalnit in celalalte limbaje cu paradigma OOP) , ce ne ajuta la furnizarea accesului la membrii privati unei clase cu care este prieten ("friend") . NOTA ** : Acest lucru reprezinta o abatere de la incapsularea membriilor si trebuie folosit cat mai putin posibil . (In doar anumite contexte favorabile) Pentru ca are acces la membrii clasei , nu inseamna ca este MEMBRU AL CLASEI (Nu pot fi accesati prin obiectul clasei). Ele se declara cu eticheta "friend" , in interiorul clasei cu care e prieten . Implementarea acesteia se face in exterior (Global sau in interiorul clasei din care face parte ) . E important sa cunoastem acest concept pentru supraincarcarea operatorilor pe care o vom face in urmatoarele tutoriale !! Functiile Prieten primesc ca argument referintele obiectelor pentru accesul membriilor . ** Exemplu de Utilizare ** /// User.h // Restu Codului friend void objectToString(User& const user); // ACESTA NU MAI ESTE MEMBRU AL CLASEI (DOAR FUNCTIE GLOBALA) // DAR II DAM ATRIBUT DE FUNCTIE PRIETEN AL CLASEI , CE NE DA OPORTUNITATEA SA FOLOSIM MEMBRII // DESI E NU E MEMBRU , EL TREBUIE DECLARAT (NU IMPLEMENTAT) EXPLICIT IN CLASA UNDE ARE NEVOIE DE ACCES . Functia , nefiind membru al clasei , se implementeaza global (daca nu apartine unei clase) sau in interiorul clasei de unde apartine : // User.cpp /// <summary> /// IN AFARA CLASEI /// </summary> /// /// /// void objectToString(User& const user) // Functie globala (NU E TRECUT "User::objectToString()" sa fie membru al clasei) { // DOAR AFISAM CAMPURILE OBIECTULUI std::cout << "\n{" << "\nID Utilizator : " << user.id << " ,\n" // Acces ID FARA GETTER << "Nume Utilizator : " << user.username << " ,\n" // Acces Username FATA GETTER << "Adresa Mail : " << user.email << " ,\n" // Acces Email FARA GETTER << "Parola Utilizator : " << user.password << " ,\n" // Acces Parola FARA GETTER << "Numar Posturi : " << user.nrPosts << ", \n" // Acces la Nr Posturi FARA GETTER << "STATUS BANAT : " << (user.isBanned ? "ESTE INTERZIS " : "NU ESTE INTERZIS") << " PE LEAGUECS!!, \n }"; /* DACA NU ERA FUNCTIE PRIETEN , NU REUSEAM CA FUNCTIE GLOBALA SA ACCESAM MEMBRII FARA GETTERI !!! */ } Iar apelul , in functia principala , va fi : #include "User.h" int main() { User user1("Alin", "alin@gmail.com", "alipassword"); // Apelam Constructor Default (Implicit) objectToString(user1); // Afisam Obiectul dintr-o functie global cu eticheta de prieten } ** Clase Prieten ** Totodata , prieten poate fi o alta clasa , clasa prieten va avea acces la informatia privata a clasei prin care se urmareste o relatie de prietenie . De exemplu , setam clasa Utilizator sa fie prieten cu clasa de manipulare a sirurilor de caractere "StringHandling" , din cadrul proiectului nostru : Prima data , stabilim relatia de prietenie dintre cele doua clase : // StringLGCS.h class StringLGCS{ // RESTUL DECLARATIILOR /// DECLARAM O CLASA PRIETEN UTILIZATOR (TOATE METODELE DIN CLASA UTILIZATOR AU ACCES LA CELE DIN STRINGLGCS) friend class User; }; Iar apoi , in constructorul cu parametrii al clasei Utilizator , de exemplu , accesam continutul privat al clasei "StringLGCS" : // User.cpp // Constructorul cu parametrii cu putine modificari pentru demonstrare User::User(const char* username, const char* email, const char* password) : id{ s_id++ }, nrPosts{ 0 }, isBanned{ false }, stringHandling {nullptr} { StringLGCS friendObject = StringLGCS(username); // Initializam constructorul cu numele de utilizator // Deoarece este stabilita relatia de prietenie , putem printr-un obiect , sa accesam membrul privat fara getteri !!! StringLGCS::allocAndFetchString(&this->username,friendObject.string); // Accesam membrul privat fara probleme friendObject.setString(email); // Schimbam sirul cu urmatoarea informatie StringLGCS::allocAndFetchString(&this->email ,friendObject.string); // Setam Adresa De Mail friendObject.setString(password); StringLGCS::allocAndFetchString(&this->password,friendObject.string); // Setam Parola /// PE SCURT , NU AM AVUT NEVOIE DE GETTERI SA ACCESEZ CONTINUTUL PRIVAT !! } NOTA 1 * : Vom discuta , in tutorialele urmatoare de POO , importanta relatiilor de prietenie si o implementare mai vasta a acestora !! (LA MOMENTUL LOR) NOTA 2 * : Am uitat sa mentionez , RELATIA DE PRIETENIE NU ESTE MUTUALA !! ATENTIE , DACA CLASA "UTILIZATORI" E PRIETEN CU CLASA "STRINGLGCS" , ASTA NU INSEAMNA CA "STRINGLGCS" E PRIETEN CU "UTILIZATORI" !!!!!
Global-Moderators Dexter. @ GOV.RO Postat Decembrie 29, 2024 Global-Moderators Postat Decembrie 29, 2024 Un aspect foarte bine atins și adus în discuție. m.r 'nota-2'. Felicitări, îmi place foarte mult ceea ce postezi și faci in această secțiune!
Postări Recomandate