Sari la conținut

Postări Recomandate

  • Moderators
Postat

** " Ce este pointerul "this" " ? **

Pointerul "this" reprezinta o modalitate de a accesa membrii unei clase , in interiorul acesteia .  Apare ca necesitate pentru evitarea conflictelor de "nume" (declarat) dintre membrii clasei si parametrii locali (argumentele unei functii , variabile locale etc.) . 

NOTA ** :  Pointerul "this" reprezinta un concept STRICT C++ . Cu alte cuvinte , in celalalte limbaje cu paradigma POO nu avem acest concept deoarece nu exista pointeri . 

** Exemplu Utilizare in C++ **

NOTA ** : Codul preluat este preluat din tutorialele trecute !! 

  Sa presupunem ca avem constructorul cu parametrii  : 

Utilizator(unsigned _id, const char* _username, const char* _email, const char* _password)
	// Constructor cu Parametrii Esentiali (Un utilizator NOU nu poate sa aiba ban sau posturi)
{
	// Variabile cu Alocare Statica 
	id = _id;  // Preluam din parametru 
	nrPosts = 0;  // IMPLICIT 0 POSTURI LA CONSTRUCTIA UTILIZATORULUI 
	isBanned = false;  // NU E BANAT

	// Variabile cu Alocare Dinamica 

	atribuireSirCaractere(&username, _username);
	atribuireSirCaractere(&email, _email);
	atribuireSirCaractere(&password, _password);

}

Totul e ok deoarece am evitat conflictul de "nume" dintre membrii clasei si parametrii . Practic , am pus un caracter  suplimentar ,  "_" ,  ce face diferenta .

Altfel : 

Utilizator(unsigned id, const char* username, const char* email, const char* password)  // Schimba numele declarat asociate argumentelor constructorului !
	// Constructor cu Parametrii Esentiali (Un utilizator NOU nu poate sa aiba ban sau posturi)
{
   /// MEREU O VARIABILA LOCALA SAU UN ARGUMENT VOR AVEA PRIORITATE IN FATA MEMBRIILOR PRIVIND NUMELE !! 

   // Variabile cu Alocare Statica
   
   /// APARE CONFLICTUL DE NUME SI VOR AVEA URMATOARELE EFECTE (RUNTIME SI LOGICE) : 
   
	id = id; // ARGUMENTUL ID = ARGUMENTUL ID ; 
    // Urmatorii doi sunt OK deoarece primesc valori implicite !! (Eventual la setteri vor aparea conflicte daca se pune acelasi nume la argument cu al membrului ) 
	nrPosts = 0;  // IMPLICIT 0 POSTURI LA CONSTRUCTIA UTILIZATORULUI 
	isBanned = false;  // NU E BANAT

	// Variabile cu Alocare Dinamica 

	atribuireSirCaractere(&username, username);  /// EROARE RUNTIME ==> USERNAME E SIR DE CARACTER CONSTANT IAR LA INCERCAREA DE A ACCESA MEMBRUL "USERNAME" va esua programul cu eroare la accesarea unei zone de memorie neexistenta !! (Pentru ca nu i s-a atribuit nimic)
	atribuireSirCaractere(&email, email); /// IDEM ca la prima 
	atribuireSirCaractere(&password, password); /// IDEM ca la prima 

}

Daca vrem sa pastram acelasi nume atat pentru membru cat si pentru argument , aplicam pointerul "*this" : 

Utilizator(unsigned id, const char* username, const char* email, const char* password)
	// Constructor cu Parametrii Esentiali (Un utilizator NOU nu poate sa aiba ban sau posturi)
{
	// Variabile cu Alocare Statica 
	this->id = id;  // Accesam Membru cu pointerul this-> (Sageata ca E POINTER)
	(*this).nrPosts = 0;  // SAU ASA
	isBanned = false;  // Nu exista conflict de nume , NU AVEM DE CE sa l folosim 

	// Variabile cu Alocare Dinamica 

	atribuireSirCaractere(&this->username, username);
	atribuireSirCaractere(&(*this).email, email);
	atribuireSirCaractere(&this->password,password);

	///// ORI "this->" ORI "(*this)." NU ARE IMPORTANTA (Recomand totusi prima varianta) 

}

NOTA 1 * : IL PUTEM FOLOSI DOAR IN INTERIORUL CLASEI (In constructor,destructor,functii etc.) doar pentru acest scop !! 

NOTA 2* : NU SE POATE FOLOSI IN CADRUL FUNCTIILOR STATICE SI PENTRU ACCESAREA MEMBRIILOR STATICI (INDIFERENT CA FAC PARTE SAU NU DIN CLASA) !! 

  • Like 1
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