Sari la conținut

[Programarea Orientata Pe Obiecte - C++] Conceptul de Clase & Functii "Friend"


Postări Recomandate

  • Moderators
Postat

 

** 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
Postat

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!

Vizitator
Acest topic este acum închis pentru alte răspunsuri.
  • Navigare recentă   0 membri

    • Nici un utilizator înregistrat nu vede această pagină.
×
×
  • Creează nouă...

Informații Importante

Termeni de Utilizare & Politică Intimitate