在C++中复制两个相似的结构 我想在C++中复制两个类似的结构。考虑下面三种结构。
在C++中复制两个相似的结构 我想在C++中复制两个类似的结构。考虑下面三种结构。,c++,struct,C++,Struct,struct Dest_Bio { int age; char name; }; struct Source_Bio { int age; char name; }; struct Details { int id; Dest_Bio* st_bio; //Needs to be populated with values from Source_Bio }; 我在“Source_Bio”结构中填写了值 我
struct Dest_Bio
{
int age;
char name;
};
struct Source_Bio
{
int age;
char name;
};
struct Details
{
int id;
Dest_Bio* st_bio; //Needs to be populated with values from Source_Bio
};
我在“Source_Bio”结构中填写了值
我想将Source_Bio中的这些值复制到st_Bio的“细节”结构中。
我不想为Dest_Bio创建成员
我尝试了以下方法。它编译得很好,但在运行时会使程序崩溃
Source_Bio st_ob;
st_ob.age = 5;
st_ob.name = 't';
Details st_a;
st_a.id = 1;
st_a.st_bio = (Dest_Bio*) malloc(sizeof(Dest_Bio));
memcpy((struct Dest_Bio*)&st_a.st_bio, (struct Source_Bio*)&st_ob,sizeof(Dest_Bio));
我怎样才能做到这一点?提前感谢简单的方法可能是这样的:
struct Dest_Bio {
int age;
char name; // should this really be a string instead of a single char?
Dest_Bio(Source_Bio const &s) : age(s.age), name(s.name) {}
};
Details st_a;
st_a.id = 1;
st_a.st_bio = new Dest_Bio(st_ob);
更好的是,您可能应该删除Dest_Bio和Source_Bio,并用just Bio替换它们,然后使用它。几乎可以肯定的是,您还想用某种智能指针替换Dest_Bio*st_Bio——一个原始指针几乎是自找麻烦。或者,只需在Details对象中嵌入一个Bio对象,这可能是首选。简单的方法可能是这样的:
struct Dest_Bio {
int age;
char name; // should this really be a string instead of a single char?
Dest_Bio(Source_Bio const &s) : age(s.age), name(s.name) {}
};
Details st_a;
st_a.id = 1;
st_a.st_bio = new Dest_Bio(st_ob);
更好的是,您可能应该删除Dest_Bio和Source_Bio,并用just Bio替换它们,然后使用它。几乎可以肯定的是,您还想用某种智能指针替换Dest_Bio*st_Bio——一个原始指针几乎是自找麻烦。或者,只需在Details对象中嵌入一个Bio对象可能是首选。既然您已经要求两个Bio类型都具有布局兼容性,那么就创建一个通用的Bio类型。然后在C++中复制,而不是c:
st_a.st_bio = new Bio(st_ob);
如果它们确实需要不同的类型,那么您可以通过构造函数或转换运算符将Source_Bio转换为Dest_Bio
这是假设你有一个真正的理由,你的第三个要求,它是一个指针,而不是一个成员。否则,将其作为成员,修复潜在的内存泄漏,并进一步简化代码:
st_a.st_bio = st_ob;
如果你真的想使用C函数,那么你需要复制到st_a.st_bio,而不是&st_a.st_bio,即覆盖对象,而不是指向它的指针。只有当你讨厌维护代码的人时才这样做。既然你已经要求两个Bio类型都是布局兼容的,那么就创建一个通用的Bio类型。然后在C++中复制,而不是c:
st_a.st_bio = new Bio(st_ob);
如果它们确实需要不同的类型,那么您可以通过构造函数或转换运算符将Source_Bio转换为Dest_Bio
这是假设你有一个真正的理由,你的第三个要求,它是一个指针,而不是一个成员。否则,将其作为成员,修复潜在的内存泄漏,并进一步简化代码:
st_a.st_bio = st_ob;
如果你真的想使用C函数,那么你需要复制到st_a.st_bio,而不是&st_a.st_bio,即覆盖对象,而不是指向它的指针。只有当你讨厌维护代码的人时才这样做。你的memcpy是指向st_a.st_bio的地址,但这已经是一个指针了。去掉&。这是我每天在一个大型C源代码库中处理的事情,从这个源代码库中可以生成多个应用程序。而且,它是不断发生变化和更新问题的根源。这似乎是一个切碎的例子,从中你似乎没有理由想把C++变成C,所以我很好奇为什么要这样做。你应该是只使用BIO,而不是SooCeSiBio和DestyBio,而这个类的实例是源代码还是Destin是基于你的代码的上下文。st_a.st_bio的地址,但这已经是一个指针了。去掉&。这是我每天在一个大型C源代码库中处理的事情,从这个源代码库中可以生成多个应用程序。而且,它是不断发生变化和更新问题的根源。这似乎是一个切碎的例子,从中你似乎没有理由想把C++变成C,所以我很好奇为什么要这样做。你应该使用BIO,而不是SooCeSiBio和DestyBio,而这个类的实例是源还是Destin是基于你的代码的上下文。