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

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

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

*foo = *bar.foo;

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

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

10
задан Anonymous 20 December 2009 в 20:35
поделиться

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;
};
19
ответ дан 3 December 2019 в 17:59
поделиться

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

1
ответ дан 3 December 2019 в 17:59
поделиться

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

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

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

2
ответ дан 3 December 2019 в 17:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: