C++ 深度复制结构C++;
我正在尝试为我的结构构建一个深度复制函数。在主程序中,我尝试将a深度复制到c中,所以最后它应该打印字符串“B”。我做错了什么?我知道我现在缺少一些晦涩难懂的指针C++ 深度复制结构C++;,c++,object,deep-copy,C++,Object,Deep Copy,我正在尝试为我的结构构建一个深度复制函数。在主程序中,我尝试将a深度复制到c中,所以最后它应该打印字符串“B”。我做错了什么?我知道我现在缺少一些晦涩难懂的指针 #include <iostream> using namespace std; struct Thing { size_t length; std::string txt; struct Thing *things[]; }; struct Thing *deepCo
#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;
}
#包括
使用名称空间std;
结构物{
尺寸与长度;
std::string-txt;
结构对象*对象[];
};
结构物*深度复制(结构物*原点){
事物tmp;
tmp.length=原点->长度;
对于(整数i=0;整数[i]);
返回&tmp;
}
int main(){
事物a,b,*c;
a、 长度=1;
a、 事物[0]=&b;
a、 txt=“a”;
b、 txt=“b”;
b、 长度=0;
c=深度复制(&a);
cout无法返回局部变量的地址。函数完成时,它不再有效。传递两个指针(源和目标)要改为运行您将返回一个指向具有自动存储持续时间的对象的指针,因为控件离开功能范围后,该对象处于不确定状态,使用c
解除对其的引用是未定义的行为。或者返回该对象的完整副本,然后获取其地址并将其放入c
,或者将指向c
的引用或指针赋给函数(或者将deepCopy
作为Thing的成员函数,并将其分配给实例,而不是临时的,这可能是最好的解决方案).执行深度复制的最佳方法是编写代码,以便编译器为您执行此操作。编译器会自动生成复制构造函数和赋值运算符,复制对象的每个成员。只要每个成员都知道如何复制自己,这通常会按您希望的方式工作。如果你有指针和手动管理的内存,因为指针不知道它们是否拥有它们所指向的内容。如果你不使用任何指针,你通常都很好
因此,如果您这样编写对象:
struct Thing
{
std::string txt;
std::vector<Thing> things;
};
我删除了大小字段,因为std::vector
知道它自己的大小,所以不需要它。启用所有警告,问题就会很明显(在gcc中是-Wall
)这将对你有帮助。C++和C是一个不公平的混合体,除了已经提到的局部参数地址之外,这里还有一个未定义的行为:
最后一个正确的答案:)事实是我需要这个结构:)我需要实现深度复制功能..@user5504743给你这个结构的人不擅长编程。
Thing a;
Thing b = a; // just works