Запись глубокой копии - копирование значения указателя - PullRequest
10 голосов
/ 20 декабря 2009

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

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

*foo = *bar.foo;

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

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

Ответы [ 3 ]

19 голосов
/ 20 декабря 2009

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

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;
};
2 голосов
/ 20 декабря 2009

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

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;
}

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

1 голос
/ 20 декабря 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...