1

我想在 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”结构中填写了值
  • 我想将 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));

我怎样才能完成这项工作?提前致谢

4

2 回答 2

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_BioSource_Bio替换为 justBio并完成它。您几乎肯定也想Dest_Bio *st_bio用某种智能指针替换您的指针——原始指针几乎是在自找麻烦。Bio或者,只需在对象内嵌入一个Details对象(可能是首选)。

于 2013-10-01T23:19:18.727 回答
1

由于您已经要求这两种Bio类型都与布局兼容,因此请创建一个通用类型Bio。然后在 C++ 而不是 C 中进行复制:

st_a.st_bio = new Bio(st_ob);

如果它们确实需要是不同的类型,那么您可以通过构造函数或转换运算符进行转换Source_BioDest_Bio

这是假设您对第三个要求有真正的理由(它是指针而不是成员)。否则,使其成为成员,修复潜在的内存泄漏,并进一步简化代码:

st_a.st_bio = st_ob;

如果你真的想乱用 C 函数,那么你想复制到st_a.st_bio,而不是复制到&st_a.st_bio(即覆盖对象,而不是指向它的指针)。仅当您讨厌维护代码的人时才这样做。

于 2013-10-01T23:21:03.933 回答