2009-12-20 6 views
8

Podczas pisania konstruktora kopiowania dla klasy zawierającej wskaźnik do dynamicznie przydzielanej pamięci, mam pytanie.Pisanie głębokiej kopii - kopiowanie wartości wskaźnika

Jak mogę określić, że wartość wskaźnika kopiowanego obiektu ma zostać skopiowana do wskaźnika skopiowanego do obiektu. Oczywiście coś takiego nie działa ...

*foo = *bar.foo; 

dlatego, obiekt bar jest usuwany (cel kopiowania obiektu w pierwszej kolejności), a to właśnie jest kopiowany do punktu obiektu do foo to samo miejsce.

Jakie jest rozwiązanie tutaj? Jak mogę pobrać wartość dynamicznie przydzielonej pamięci i skopiować ją na inny adres?

+0

pytanie nie ma sensu. Spróbuj go sformatować, ewentualnie dodaj więcej kodu, który ilustruje, o co pytasz. –

+0

Potrzebujesz więcej informacji: Typ foo byłby dobry. Dowolni inni członkowie. Wyjaśnienie, dlaczego nie używasz inteligentnego wskaźnika? –

+0

Dotyczy to tablicy, ale może być przydatna: http://stackoverflow.com/questions/255612/c-dynamically-allocating-an-array-of-objects/255744#255744 –

Odpowiedz

18

przydzielić nowy obiekt

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

Nie widzę kontekstu, ale kod, który wysłałeś, nie przypomina kopiowania wskaźnika, to jest dokładnie to, o co prosisz - kopiowanie wszystkiego, co wskazuje. Pod warunkiem, że foo wskazuje na przydzielony obiekt.

2

Zakładam klasa wygląda następująco.

class Bar { 
    Foo* foo; 
    ... 
} 

W tym celu głęboką kopię, trzeba utworzyć kopię obiektu wskazywanego przez „bar.foo”. W C++ można to zrobić tylko za pomocą operatora new powołać class Foo Kopią konstruktora:

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

Uwaga: Przedstawione rozwiązanie delegaci decyzja, czy konstruktor kopia new Foo (constFoo &) czy też „głębokie skopiuj "do implementacji klasy Foo ... dla uproszczenia zakładamy, że robi to" właściwą rzecz "!

[Uwaga ... pytanie w formie pisemnej jest bardzo mylące - prosi o "wartość wskaźnika skopiowanego z obiektu", które nie brzmi jak głęboka kopia: brzmi jak płytka kopia czyli to.

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

zakładam to tylko niewinne zamieszanie na części Asker, a głęboka kopia jest to, co chciała.]