Ho scoperto di recente che quando ho dei puntatori all'interno di una classe, devo specificare un costruttore di copia.Copia costruttore con puntatori
Per apprendere, ho realizzato il seguente codice semplice. Si compila, ma mi dà errore di runtime quando si esegue il costruttore di copie.
Sto tentando di copiare solo il valore dal puntatore dell'oggetto copiato, ma evitando di assegnare lo stesso indirizzo.
Quindi, cosa c'è che non va qui?
class TRY{
public:
TRY();
~TRY();
TRY(TRY const &);
int *pointer;
void setPointer(int);
};
void TRY::setPointer(int a){
*pointer = a;
return;
}
TRY::TRY(){}
TRY::~TRY(){}
TRY::TRY(TRY const & copyTRY){
int a = *copyTRY.pointer;
*pointer = a;
}
int main(){
TRY a;
a.setPointer(5);
TRY b = a;
b.setPointer(8);
cout << "Address of object a = " << &a << endl;
cout << "Address of object b = " << &b << endl;
cout << "Address of a.pointer = " << a.pointer << endl;
cout << "Address of b.pointer = " << b.pointer << endl;
cout << "Value in a.pointer = " << *a.pointer << endl;
cout << "Value in b.pointer = " << *b.pointer << endl;
return 0;
}
sarò con questo concetto per le altre classi con un sacco di puntatori in esso, in cui ho bisogno di copiare tutti i valori da sul oggetto all'altro. La copia è inizialmente necessaria per questo codice, quindi mi piacerebbe mantenere la possibilità di copia (non nasconderò il costruttore di copie come privato).
Inoltre, la vera classe che devo implementare ha come 10 puntatori e potrebbe cambiare nel tempo. Non c'è un modo un po 'più intelligente di avere un costruttore di copia profonda in C++? ...
Non dimenticare di eliminare m_p prima di assegnare un nuovo oggetto per esso. – xtofl
Non ho definito l'operatore di assegnazione, è solo un costruttore di copie. Quindi non è necessario eliminare m_p. – Naveen
In un costruttore, m_p sarà inizialmente indefinito a meno che non lo si inserisca esplicitamente nell'elenco di inizializzazione. Se si tenta di eliminare un puntatore non definito, accadranno cose brutte. –