Newsgroup: it.comp.lang.c++
Titolo: Dubbio su copy constructor e overload =

Ciao a tutti, scusate la domanda, magari per voi banale e che magari
risulta essere una FAQ... ma anche cercando su Google non sono riuscita a
capire come risolvere un problema che mi assilla... e siccome vorrei
riuscire a proseguire entro l'anno nuovo e magari anche a laurearmi provo a
chiedere direttamente a voi :-)
Ho implementato una classe Matrice, fatta all'incirca cosi':
class Matrice
{
  public:	  
    typedef vector<int> riga;
  protected:	
    vector<riga> datiMatrice;
.....
} 
con tutti i metodi per manipolarla. Da questa classe eredita un altro tipo
di matrice... ma non e' basilare per la spiegazione del problema. Ora... io
avrei bisogno di implementare un copy constructor e possibilmente di
realizzare l'overload dell'operatore di assegnamento =, ma soprattutto per
il primo, non riesco a fare in modo che l'oggetto origine e la copia non
condividano lo spazio di memoria, per cui ogni modifica fatta su uno si
ripercuote anche sull'altro. Sapete per caso suggerirmi qualcosa? Mi scuso
ancora... eventualmente... per la banalita' del problema.
Ciao Faby

 condividano lo spazio di memoria, per cui ogni modifica fatta su uno si
potresti postare come hai realizzato per ora
il copy constructor e l'overload di =
magari qualcuno vede dov'e' il problema...
:-)
--
Ciao!
Skunkguru.

 :-)
L'overload di = in realta' non l'ho ancora realizzato, non essendo riuscita
a far funzionare nemmeno il copy constructor.
Per quanto riguarda quest'ultimo, leggendo alcuni messaggi in google, avevo
provato a realizzarlo come:
Matrice::Matrice(const Matrice& m):datiMatrice(m.datiMatrice)
{
}
ma non sembra funzionare molto, in quanto il nuovo oggetto condivide la
memoria con il primo.
Grazie mille :-)
Faby

 memoria con il primo.
Di quale memoria parli? 'datiMatrice' è un std::vector<>. Il copy-ctor di
std::vector<> alloca nuova memoria e copia i valori del vector sorgente. In
nessun modo si possono ottenere due std::vector che condividano la memoria.
Max

 nessun modo si possono ottenere due std::vector che condividano la memoria.
Ho provato il copy constructor con questo semplice main: 
Matrice* m = new Matrice(5, 10);
Matrice* m1 = m;
cout << "La dimensione di m1 e' " << m1->getDimensione() << endl;
m->orlaMatrice();
cout << "La dimensione di m e' " << m->getDimensione() << endl;
cout << "La dimensione di m1 e' " << m1->getDimensione() << endl;
m1->orlaMatrice();
cout << "La dimensione di m e' " << m->getDimensione() << endl;
cout << "La dimensione di m1 e' " << m1->getDimensione() << endl;  
dove orlaMatrice e' un metodo che aggiunge una riga e una colonna alla
matrice, che e' quadratata. L'output e' il seguente:
La dimensione di m1 e' 5
La dimensione di m e' 6
La dimensione di m1 e' 6
La dimensione di m e' 7
La dimensione di m1 e' 7
Questo mi ha fatto pensare che le due matrici condivissero in qualche modo
la memoria. Da qui la sensazione di aver sbagliato qualcosa
nell'implementazione del copy constructor... dove sbaglio?
Ciao Faby

 Matrice* m1 = m;
Ma scusa... qui non crei una nuova matrice, ma un secondo puntatore a
Matrice che fai puntare alla prima matrice.
Per forza che ti pare che condividano la memoria:
Hai una matrice sola e 2 puntatri ad essa!
Perchè lavori con i puntatori?
prova:
Matrice m(5,10);
Matrice m1(m);
Matrice m2 = m;
-- 
Gerolamo
www.overweb.it

 Perchè lavori con i puntatori?
Perche' questa semplice classe e' integrata in un applicativo piu' grande e
mi sembra sia piu' opportuno lavorare cosi'... comunque sono riuscita,
grazie al provvidenziale aiuto di un amico, a far funzionare il tutto anche
cosi' (o almeno mi sembra), modificando la chiamata del costruttore nel
seguente modo:
Matrice* m = new Matrice(5,10); 
Matrice* m1 = new Matrice(*m); 
In ogni caso, grazie mille per l'aiuto e se avete altri commenti sono
sicuramente ben accetti.
Ciao Faby

 sicuramente ben accetti.
L'importante è che tu sappia cosa stai facendo. (Ad ogni 'new' dovrà
corrispondere un 'delete'.) Se provieni da Java e usi 'new' per "abitudine", è
possibile che tu non sappia cosa stai facendo.
Max

 possibile che tu non sappia cosa stai facendo.
Ok... va beh niubba ma proprio cosi' tanto no... in ogni caso grazie
dell'osservazione :-). Comunque ho scritto anche gli opportuni distruttori
per gli oggetti... ho presente i problemi di un uso indiscriminato delle
new.
Ciao Faby