2009-12-20 42 views
8

Nella scrittura di un costruttore di copia per una classe che contiene un puntatore alla memoria allocata dinamicamente, ho una domanda.Scrittura di una copia profonda - copia del valore del puntatore

Come è possibile specificare che voglio che il valore del puntatore dell'oggetto copiato da copiare nel puntatore dell'oggetto copiato in oggetto. Ovviamente qualcosa come questo non funziona ...

*foo = *bar.foo; 

perché, l'oggetto barra è in corso l'eliminazione (lo scopo di copiare l'oggetto in primo luogo), e questo solo è il punto copiato foo dell'oggetto per lo stesso posto.

Qual è la soluzione qui? Come posso prendere il valore della memoria allocata dinamicamente e copiarlo su un indirizzo diverso?

+0

domanda non ha senso. Si prega di provare e riformularlo, possibilmente inserendo più codice che illustra ciò che stai chiedendo. –

+0

Hai bisogno di ulteriori informazioni: il tipo di foo sarebbe buono. Qualsiasi altro membro. Una spiegazione del perché non stai usando un puntatore intelligente? –

+0

Questo riguarda l'array ma potrebbe essere utile: http://stackoverflow.com/questions/255612/c-dynamically-allocating-an-array-of-objects/255744#255744 –

risposta

18

allocare nuovo oggetto

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

Non vedo il contesto, ma il codice che hai postato non sembra copiare il puntatore, è esattamente quello che chiedi - copiare qualunque cosa punti. A patto che foo punti all'oggetto assegnato.

2

Presumo la classe si presenta così.

class Bar { 
    Foo* foo; 
    ... 
} 

Per fare una copia profonda, è necessario creare una copia dell'oggetto a cui fa riferimento 'bar.foo'. In C++ si esegue questa operazione semplicemente utilizzando l'operatore new per invocare la copia costruttore della classe di Foo:

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

Nota: questa soluzione delegati la decisione se il costruttore di copia nuova Foo (constFoo &) fa anche un 'profondo copia 'all'implementazione della classe Foo ... per semplicità assumiamo che faccia la' cosa giusta '!

[Nota ... la domanda come scritta è molto confusa - chiede il "valore del puntatore del copiato dall'oggetto" che non suona come una copia profonda per me: sembra una copia superficiale , cioè questo.

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

Suppongo che questo è solo confusione innocenti da parte del richiedente, e una copia profondo è quello che si vuole.]

Problemi correlati