2009-12-20 13 views
8

Al escribir un constructor de copia para una clase que contiene un puntero a la memoria asignada dinámicamente, tengo una pregunta.Escribir una copia profunda - copiando el valor del puntero

Cómo puedo especificar que deseo que el valor del puntero del objeto copiado se copie en el puntero del objeto copiado. Obviamente algo como esto no funciona ...

*foo = *bar.foo; 

porque, se elimina el objeto de barras (con el fin de copiar el objeto en primer lugar), y esto sólo ha copiado el punto de foo del objeto a el mismo lugar.

¿Cuál es la solución aquí? ¿Cómo puedo tomar el valor de la memoria asignada dinámicamente y copiarla en una dirección diferente?

+0

pregunta no tiene sentido. Por favor, intenta reformularlo, posiblemente publicando más código que ilustre lo que estás preguntando. –

+0

Necesito más información: El tipo de foo sería bueno. Cualquier otro miembro. ¿Una explicación de por qué no está usando un puntero inteligente? –

+0

Esto se refiere a la matriz pero puede ser útil: http://stackoverflow.com/questions/255612/c-dynamically-allocating-an-array-of-objects/255744#255744 –

Respuesta

18

asignar nuevo objeto

class Foo 
{ 
    Foo(const Foo& other) 
    { 
     // deep copy 
     p = new int(*other.p); 

     // shallow copy (they both point to same object) 
     p = other.p; 
    } 

    private: 
     int* p; 
}; 
1

No veo el contexto, pero el código que publica no parece copiar el puntero, es exactamente lo que usted solicita, copiando lo que sea que señale. Siempre que foo apunte al objeto asignado.

2

Asumo la clase tiene este aspecto.

class Bar { 
    Foo* foo; 
    ... 
} 

Con el fin de hacer una copia profunda, es necesario crear una copia del objeto referenciado por 'bar.foo'. En C++ lo hace sólo mediante el uso del operador new para invocar copia constructor de la clase de Foo:

Bar(const Bar & bar) 
{ 
    this.foo = new Foo(*(bar.foo)); 
} 

Nota: esta solución delegados la decisión de si el constructor de copia new Foo (constFoo &) también hace un 'profundo copiar 'a la implementación de la clase Foo ... ¡por simplicidad suponemos que hace lo' correcto '!

[Nota ... la pregunta tal como está escrita es muy confusa: solicita el 'valor del puntero del objeto copiado' que no me suena como una copia profunda: eso suena como una copia superficial , es decir esto.

Bar(const Bar & bar) 
{ 
    this.foo = bar.foo; 
} 

Supongo que esto es sólo confusión inocente por parte del autor de la pregunta, y una copia en profundidad es lo que se quiere.]

Cuestiones relacionadas