在为包含动态分配内存的指针的类编写复制构造函数时,我有一个问题。
如何指定我希望将复制的对象的指针值复制到复制到对象的指针。显然这样的事情不起作用......
*foo = *bar.foo;
因为,正在删除bar对象(首先复制对象的目的),这只是复制到对象的foo指向同一个地方。
这里有什么解决方案?如何获取动态分配的内存的值,并将其复制到不同的地址?
答案 0 :(得分:19)
您分配新对象
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 :(得分:2)
我认为你的班级看起来像这样。
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;
}
我认为这只是提问者的无辜混淆,并且需要深层复制。]
答案 2 :(得分:1)
我没有看到上下文,但是您发布的代码似乎不像复制指针一样,它正是您要求的 - 复制它指向的任何内容。前提是foo指向分配的对象。