Sari la conținut

[Programarea Orientata Pe Obiecte - C++] Constructor de Copiere & Clone (2)


Postări Recomandate

  • Moderators
Postat

** OBIECTIV ** 

Prin aceasta postare , dorim sa explicam si sa implementam , folosind codul de POO , conceptul de COPIERE(CLONARE) ADANCITA (aka "Deep Copy") a unui obiect !!

Clonarea , din aceasta perspectiva , se va efectua FARA a creea dependente intre obiecte . In sensul ca , va prelua valorile din obiectele originale DAR se vor construi NOI zone de memorie !!! 

** IMPLEMENTARE CLONA ADANCITA ** 

Adaugam un constructor de copiere , in cadrul clasei "Utilizator" (SIMILAR CU CEL SUPERFICIAL , LA DECLARATIE) :  

// user.h 

class User{

/// RESTU CODULUI 

User(const User& otherUser); // PREIA REFERINTA OBIECTULUI ORIGINAL (DECLARARE CONSTRUCTOR DE COPIERE)
};

+ Implementare

// User.cpp 

User::User(const User& originalObject)  // CONSTRUCTOR DE COPIERE (COPIERE ADANCITA)
	: id{ originalObject.id }, nrPosts{ originalObject.nrPosts }, isBanned{originalObject.isBanned},
	stringHandling{new StringLGCS(originalObject.username)}
{
    //**** POINTERI ISI IMPART VALORILE , NU REFERINTELE

	   /*
	   
	         OBIECT ORIGINAL                  OBIECT CLONA 
	     username    0xda34133     -->        username     0xdc999   (ZONE SEPARATE DE MEMORIE )
		             "IONEL"                               "IONEL"   (VALORI SIMILARE)
	   */

	StringLGCS::allocAndFetchString(&this->username, stringHandling->getString());  // Setam Numele de Utilizator 
	stringHandling->setString(originalObject.email); // Schimbam sirul cu urmatoarea informatie 
	StringLGCS::allocAndFetchString(&this->email, stringHandling->getString()); // Setam Adresa De Mail 
	stringHandling->setString(originalObject.password);  
	StringLGCS::allocAndFetchString(&this->password, stringHandling->getString()); // Setam Parola 

}

In programul principal , vom initializa patru obiecte cu tipuri diferite de constructori (cu parametrii , implicit si 2 de copiere) si le vom afisa

// entryPoint.cpp 

#include "User.h" // Includem Clasa de Utilizatori 


int main()
{
	User *user3, *user4; 

{
	User user1,
		user2("Vasile", "vasile@gmail.com", "vasileparola"); // Declaram doua instante (una cu constructoru implicit + constructor cu parametrii )

	user1.setUsername("IONEL");

	// PRODUCEM 2 CLONE 

	user3 = new User(user1); // Clonam Obiectul 1 
	user4 = new User(user2);  // Clonam Obiectul 2 

	// VIZUALIZAM OBIECTELE ATUNCI CAND OBIECTELE ORIGINALE SUNT IN CONTEXT 

	user1.objectToString();
	user2.objectToString();

	std::cout << " AFISAM CLONE IN INTERIOURUL CONTEXTULUI :  \n";

	user3->objectToString(); // Clona Utilizatorului 1 
	user4->objectToString(); // Clona Utilizatorului 2 

	std::cout << std::endl; // DINSTANTIEM CU O LINIE CELE DOUA VIZUALIZARI  
}

// AFISAM CLONELE ATUNCI CAND OBIECTELE ORIGINALE AU IESIT DIN CONTEXT (S-A APELAT DESTRUCTORUL)
std::cout << " AFISAM CLONE IN AFARA CONTEXTULUI (CAND OBIECTUL ORIGINAL A IESIT DIN CONTEXT) :  \n";

user3->objectToString(); // Clona Utilizatorului 1 
user4->objectToString(); // Clona Utilizatorului 2 


	delete user3, user4;  // TOTUL ESTE OK , SUNT ZONE SEPARATE DE MEMORIE
	
	return 0;  
}

Si primim ca rezultat

{
ID Utilizator : 0 ,
Nume Utilizator : IONEL ,
Adresa Mail : BINE AI VENIT PE COMUNITATEA LEAGUECS!!! ,
Parola Utilizator : BINE AI VENIT PE COMUNITATEA LEAGUECS!!! ,
Numar Posturi : 0,
STATUS BANAT : NU ESTE INTERZIS PE LEAGUECS!!,
 }
{
ID Utilizator : 1 ,
Nume Utilizator : Vasile ,
Adresa Mail : vasile@gmail.com ,
Parola Utilizator : vasileparola ,
Numar Posturi : 0,
STATUS BANAT : NU ESTE INTERZIS PE LEAGUECS!!,
 } AFISAM CLONE IN INTERIOURUL CONTEXTULUI :

{
ID Utilizator : 0 ,
Nume Utilizator : IONEL ,
Adresa Mail : BINE AI VENIT PE COMUNITATEA LEAGUECS!!! ,
Parola Utilizator : BINE AI VENIT PE COMUNITATEA LEAGUECS!!! ,
Numar Posturi : 0,
STATUS BANAT : NU ESTE INTERZIS PE LEAGUECS!!,
 }
{
ID Utilizator : 1 ,
Nume Utilizator : Vasile ,
Adresa Mail : vasile@gmail.com ,
Parola Utilizator : vasileparola ,
Numar Posturi : 0,
STATUS BANAT : NU ESTE INTERZIS PE LEAGUECS!!,
 }
 AFISAM CLONE IN AFARA CONTEXTULUI (CAND OBIECTUL ORIGINAL A IESIT DIN CONTEXT) :

{
ID Utilizator : 0 ,
Nume Utilizator : IONEL ,
Adresa Mail : BINE AI VENIT PE COMUNITATEA LEAGUECS!!! ,
Parola Utilizator : BINE AI VENIT PE COMUNITATEA LEAGUECS!!! ,
Numar Posturi : 0,
STATUS BANAT : NU ESTE INTERZIS PE LEAGUECS!!,
 }
{
ID Utilizator : 1 ,
Nume Utilizator : Vasile ,
Adresa Mail : vasile@gmail.com ,
Parola Utilizator : vasileparola ,
Numar Posturi : 0,
STATUS BANAT : NU ESTE INTERZIS PE LEAGUECS!!,
 }

NOTA * :  IN CONCLUZIE , in aceasta abordare , spre deosebire de cealalta ("superficiala") , sunt construite zone de memorie NOI (DOAR VALOAREA ESTE PRELUATA DIN OBIECTELE ORIGINALE) ASTFEL DEVENIND OBIECTE INDEPENDENTE UNA DE CEALALTA , IN CIUDA CA SI IMPART ACELEASI VALORI !! TOTODATA  , VOI RECOMANDA ACEASTA MODALITATE PENTRU EVITAREA ERORILOR !! 

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