Jump to content

[Programarea Orientată Pe Obiecte - C++] Conceptul de Clase & Funcții "Friend"


Soulrayne
 Share

Recommended Posts

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 BZONE!!, \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 : 

 

/

// StringBZONE.h 


class StringBZONE{

 // RESTUL DECLARATIILOR 
  
  
/// DECLARAM O CLASA PRIETEN UTILIZATOR (TOATE METODELE DIN CLASA UTILIZATOR AU ACCES LA CELE DIN STRINGBZONE)
friend class User;
  
};

 

Iar apoi , in constructorul cu parametrii al clasei Utilizator , de exemplu , accesam continutul privat al clasei "StringBZONE" : 

 

// 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}
	
{
	StringBZONE friendObject = StringBZONE(username); // Initializam constructorul cu numele de utilizator 
  
  // Deoarece este stabilita relatia de prietenie , putem printr-un obiect , sa accesam membrul privat fara getteri !!! 

	StringBZONE::allocAndFetchString(&this->username,friendObject.string); // Accesam membrul privat fara probleme 
	friendObject.setString(email); // Schimbam sirul cu urmatoarea informatie 
	StringBZONE::allocAndFetchString(&this->email ,friendObject.string); // Setam Adresa De Mail 
	friendObject.setString(password);
	StringBZONE::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 "STRINGBZONE" , ASTA NU INSEAMNA CA "STRINGBZONE" E PRIETEN CU "UTILIZATORI" !!!!!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.