深层复制结构C ++

时间:2015-10-29 19:55:58

标签: c++ object deep-copy

我正在尝试为我的结构构建一个深度复制功能。在主程序中,我尝试深入复制到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;
}

3 个答案:

答案 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成为函数事情并分配给实例而不是临时的,这可能是最好的解决方案。)