|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2004
Messaggi: 364
|
Costruttore di copia C++
Salve ragazzi sono alle prese con lo studio del costruttore di copia, se il mio libro non si sbaglia, i casi in cui è opportuno usarlo sono 3: quando un oggetto inizializza esplicitamente un altro oggetto, quando la copia di un oggetto viene passata come paramentro ad una funzione e quando viene generato un oggetto temporaneo, più comunemente come valore di restituzione. Premesso questo devo implementare una lista che si ritrovi in una delle 3 situazioni prima citate, per così utilizzare un costruttore di copia, ma non riesco a creare una situazione per metterlo in atto. Cosa vuol dire che un oggetto inizializza esplicitamente un altro, a cosa serve passare la copia di un oggetto ad una funzione e soprattutto perchè dovrei restituire un oggetto in una funzione? Spero che qualcuno vorrà aiutarmi a capire meglio come e perchè usare un costruttore di copia, grazie
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Caso 1:
classe y; .... .... classe x(y); Caso 2: int f(classe z) { ... } classe x; .... .... f(x); Caso 3: classe f() { classe x; .... .... return x; } |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Apr 2004
Messaggi: 364
|
Allora perchè questo codice che inizializza un oggetto ad un'altro funziona
perfettamente anche senza un costruttore di copia? #include <iostream> using namespace std; struct nodo { int dato; struct nodo* next; }; typedef struct nodo NODO; class lista { private: NODO* testa; NODO* fine; public: lista(); ~lista(); void creazione(); void mostra(); }; lista::lista() { testa=NULL; fine=NULL; } lista::~lista() { NODO* aux; while(testa) { aux=testa; testa=testa->next; delete (aux); } } void lista::creazione() { NODO* aux; int x; cout<<"Inserire numero"<<endl; cin>>x; while(x) { aux= new (NODO); aux->dato=x; aux->next=NULL; if(!testa) testa=aux; else fine->next=aux; fine=aux; cout<<"Inserire numero"<<endl; cin>>x; } } void lista::mostra() { NODO* aux=testa; while(aux) { cout<<aux->dato<<endl; aux=aux->next; } cout<<endl; } int main() { lista lista1; lista lista2; lista1.creazione(); lista1.mostra(); lista2=lista1; lista2.mostra(); return 0; } |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Intanto quello dovrebbe essere l'operatore di assegnamento e non il cotruttore di copia
Ci sono sia un costruttore di copia che un operatore di assegnamento predefiniti in ogni calsse... Questi non fanno altro che effetture una copia membro-membro delle strutture dati membro della classe... Nel tua caso funziona eprchè vengono assegnati ai due puntatori gli indirizzi contenuti nell'altra istanza, ma in questo caso se andassi a modificare una istanza andando, ad esempio ad eliminare un elemento in coda dalla lista, l'altra istanza si ritroverebbe con un puntatore alla coda non valido... Per fare un costruttore di copia ed un operatore di assegnamento validi devi duplicare ogni elemento della lista... |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 01:45.



















