В записи конструктора копии для класса, который содержит указатель на динамично выделенную память, у меня есть вопрос.
Как я могу определить, что хочу, чтобы значение указателя скопированного с объекта было скопировано в указатель скопированного в объект. Очевидно, что-то вроде этого не работает...
*foo = *bar.foo;
потому что, объект панели удаляется (цель скопировать объект во-первых), и это просто имеет скопированный в точку нечто объекта к тому же месту.
Каково решение здесь? Как я могу принять значение динамично выделенной памяти и скопировать его в другой адрес?
Вы выделяете новый объект
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;
};
Я не вижу контекста, но опубликованный вами код не похож на копирование указателя, это именно то, что вы просите - копирование всего, на что он указывает. При условии, что foo указывает на выделенный объект.
Я предполагаю, что ваш класс выглядит так.
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;
}
Я полагаю, что это просто невинная путаница со стороны спрашивающего, и требуется полная копия.]