Recientemente descubrí que cuando tengo punteros dentro de una clase, necesito especificar un constructor de Copia.Copiar constructor con punteros
Para saberlo, he hecho el siguiente código simple. Se compila, pero me da error de tiempo de ejecución cuando se realiza el constructor de copia.
Estoy tratando de copiar solo el valor del puntero del objeto copiado, pero evitando asignar la misma dirección.
Entonces, ¿qué sucede aquí?
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;
}
voy a utilizar este concepto para otras clases con un montón de punteros en el mismo, en las que necesito para copiar todos los valores desde el objeto a la otra. La copia es necesaria inicialmente para este código, por lo que me gustaría mantener la posibilidad de copiar (no ocultaré el constructor de copia como privado).
Además, la clase real que necesito implementar tiene como 10 punteros, y podría estar cambiando con el tiempo. ¿No hay una manera un poco más inteligente para tener un constructor copia profunda en C++? ...
No olvides eliminar m_p antes de asignarle un nuevo objeto. – xtofl
No he definido el operador de asignación, solo es un constructor de copia. Por lo tanto, no es necesario eliminar m_p. – Naveen
En un constructor, m_p inicialmente no estará definido a menos que lo coloque explícitamente en la lista de inicializadores. Si intenta eliminar un puntero indefinido, sucederán cosas malas. –