2009-12-20 1 views
8

При написании конструктора копирования для класса, содержащего указатель на динамически выделенную память, у меня есть вопрос.Запись глубокого копирования - значение указателя копирования

Как я могу указать, что я хочу, чтобы значение указателя копируемого объекта копировалось в указатель скопированного объекта. Очевидно, что-то вроде этого не работает ...

*foo = *bar.foo; 

потому, что объект брусок удаляется (цель копирования объекта в первую очередь), и это только имеет скопирована в точку Foo объекта к такое же место.

Какое здесь решение? Как я могу взять значение динамически распределенной памяти и скопировать ее на другой адрес?

+0

Вопрос не имеет смысла. Попробуйте переформулировать его, возможно, разместив больше кода, который иллюстрирует то, о чем вы просите. – 2009-12-20 20:41:58

+0

Нужна дополнительная информация: Тип foo был бы хорош. Любые другие участники. Объяснение того, почему вы не используете смарт-указатель? –

+0

Это относится к массиву, но может быть полезно: http://stackoverflow.com/questions/255612/c-dynamically-allocating-an-array-of-objects/255744#255744 –

ответ

18

Вы выделяете новый объект

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

Я не вижу контекста, но код, который вы отправили, не похож на копирование указателя, это именно то, что вы просите - копируете все, на что оно указывает. Если foo указывает на выделенный объект.

2

Я полагаю, ваш класс выглядит следующим образом.

class Bar { 
    Foo* foo; 
    ... 
} 

Для того, чтобы сделать глубокую копию, вы должны создать копию объекта, на который ссылается «bar.foo». В C++ вы делаете это только с помощью оператора new для вызова копирования конструктора класса Foo в:

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

Примечание: это решение делегатов решение о том, также делает «глубока конструктор копирования нового Foo (constFoo &) копировать 'в реализацию класса Foo ... для простоты мы предполагаем, что он делает «правильную вещь»!

[Замечание ... вопрос, как написано, очень сбивает с толку - он запрашивает «значение указателя скопированного с объекта», который не звучит как глубокая копия для меня: это звучит как мелкая копия , т. е. это.

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

Я предполагаю, что это просто невинная путаница со стороны спрашивающего, и глубокая копия является то, что хотел.]