PDA

Visualizza la versione completa : [C/C++]: I costruttori di copia


Sommovir
24-09-2006, 04:15
Ciao, sto cimentandomi con i costruttori di copia.. x fare un test ho scritto un po' di codice ma non riesco a capire alcuni dettagli...

posto il codice che di diversi files ma ho preso i pezzi critici







#include <conio.h>
#include <iostream>

using namespace std;

class nodo {
private:
int ele;

public:
nodo *next;
nodo *prev;
inline int get_ele(){return ele;}
explicit nodo(int e):ele(e) {};

nodo & operator= (const nodo &n)
{
//ele = n->get_ele();
ele = 10;
next = NULL;
prev = NULL;
return *this;
}

};




int main(int argc, char *argv[])
{
int e;
cout << "inserisci elemento: \n";
cin >> e;
nodo n(e);
cout << "il nuovo nodo n contiene: " << n.get_ele() << endl;
cout << " mo costruiamo la copia \n";
nodo n2 = n;
//nodo n2(1);
//n2 = n;
cout << "la copia n2 di nodo n contiene: " << n2.get_ele() << endl;
getch();
return EXIT_SUCCESS;
}



il problema ke nella versione che ho postato come se non venisse usato l'overload dell'operatore di assegnamento e da output si capisce ke viene usato il costruttore di copia implicito che fa il suo dovere, se invece scommento le 2 righe commentate e commento "nodo n2 = n" tutto avviene come mi aspettavo, viene caricato il costruttore di copia, e come oh deciso (x testare) scrive 10 nella copia...

perch nel primo caso ci non avviene ??

e seconda domanda..

nel costruttore di copia ho commentato ele = n->get_ele(); che sarebbe la versione finale.. ma il compilatore nn me la passa proprio... n passato per rifemento.. non capisco xk non accetta la ->


grazie a chiunque mi risponda !

:dh:

fastcoder
25-09-2006, 09:06
Scusa ma dove il costruttore di copia? Nel codice che hai postato definito solo l'operatore di assegnamento e se fai:


nodo n2 = n;

viene chiamato il costruttore di copia (che non esistendo) quello di default. Se invece fai:


nodo n2;
n2 = n;

allora viene chiamato l'operatore di copia.
Per la riga commentata nell'operatore di copia prova a rendere il metodo get_ele const:


int get_ele() const {return ele;}

l'inline ridondante perch la funzione definita nella definizione della classe e di default sono gi inline. se non definisci la funzione const, non puoi chiamarla da un reference const.

:ciauz:

Loading