我想在C ++中复制两个类似的结构。考虑以下三种结构。
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 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));
我怎样才能完成这项工作?提前致谢
答案 0 :(得分:3)
简单的方法可能是这样的:
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
,并用Bio
替换它们并完成它。你几乎肯定也想用某种智能指针替换你的Dest_Bio *st_bio
- 原始指针几乎要求麻烦。或者,只需在Bio
对象中嵌入Details
对象(可能是首选)。
答案 1 :(得分:1)
由于您已经要求两个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
(即覆盖对象,而不是指向它的指针)。只有你讨厌维护代码的人才会这样做。