我正在尝试为我的结构构建一个深度复制功能。在主程序中,我尝试深入复制到c,所以最后它应该打印字符串“B”。我究竟做错了什么?我知道我现在缺少一些不起眼的指针。
#include <iostream>
using namespace std;
struct Thing {
size_t length;
std::string txt;
struct Thing *things[];
};
struct Thing *deepCopy(struct Thing *origin) {
Thing tmp;
tmp.length = origin->length;
for(int i=0;i<tmp.length; ++i)
tmp.things[i] = deepCopy(origin->things[i]);
return &tmp;
}
int main() {
Thing a, b, *c;
a.length = 1;
a.things[0] = &b;
a.txt = "A";
b.txt = "B";
b.length = 0;
c = deepCopy(&a);
cout<<c->txt;
return 0;
}
答案 0 :(得分:5)
执行深层复制的最佳方法是编写代码,以便编译器为您完成。编译器自动生成复制构造函数和赋值运算符,用于复制对象的每个成员。只要每个成员都知道如何复制自己,这通常会以您想要的方式工作。如果你有指针和手动管理的内存,它可能不会自动工作,因为指针不知道他们是否拥有他们指向的内容。如果你不使用任何指针,你通常会很好。
所以如果你像这样编写你的对象:
struct Thing
{
std::string txt;
std::vector<Thing> things;
};
复制它只会自动生效。
Thing a;
Thing b = a; // just works
我删除了size字段,因为std::vector
知道自己的大小,所以不需要。
答案 1 :(得分:1)
您无法返回局部变量的地址。功能完成时,它已经无效了。传递两个指针(源和目标)来代替
答案 2 :(得分:1)
您正在返回一个指向具有自动存储持续时间的对象的指针,因为在控件离开函数范围后,对象处于不确定状态,并且c
取消引用它是未定义的行为。返回对象的完整副本,然后获取其地址并将其放入c
,或将引用或指针传递给c
到函数中(或使deepCopy
成为函数事情并分配给实例而不是临时的,这可能是最好的解决方案。)