Написание глубокой копии - копирование значения указателя

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

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

*foo = *bar.foo;

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

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


person Anonymous    schedule 20.12.2009    source источник
comment
Вопрос не имеет смысла. Попробуйте переформулировать его, возможно, разместив больше кода, иллюстрирующего то, о чем вы спрашиваете.   -  person    schedule 20.12.2009
comment
Нужна дополнительная информация: подойдет тип foo. Любые другие участники. Объяснение, почему вы не используете умный указатель?   -  person Martin York    schedule 20.12.2009
comment
Это касается массива, но может быть полезно: stackoverflow.com/questions/255612/   -  person Martin York    schedule 21.12.2009


Ответы (3)


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

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;
};
person Nikola Smiljanić    schedule 20.12.2009

Я предполагаю, что ваш класс выглядит так.

class Bar {
   Foo* foo;
   ...
}

Чтобы сделать глубокую копию, вам необходимо создать копию объекта, на который ссылается 'bar.foo'. В C ++ вы делаете это, просто используя оператор new для вызова конструктора копирования класса Foo:

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

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

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

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

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

person Tim Lovell-Smith    schedule 20.12.2009

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

person Michael Krelin - hacker    schedule 20.12.2009