【问题标题】:Copy two similar structures in C++在 C++ 中复制两个相似的结构
【发布时间】:2013-10-01 23:13:44
【问题描述】:

我想在 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 中的这些值复制到 'Details' 结构中的 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));

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

【问题讨论】:

  • 您的memcpy 指向st_a.st_bio 的地址,但这已经是一个指针。取出&
  • 这是我每天在大型 C 源代码库中使用的东西,从该库生成多个应用程序。它是变化和更新问题的持续来源。这似乎是一个切碎的示例,您似乎没有理由将 C++ 转换为 C,所以我很好奇您为什么要这样做。
  • 您可能应该只使用Bio 而不是Source_BioDest_Bio,并且类的实例是源还是目标是基于您的代码的上下文。

标签: c++ struct


【解决方案1】:

简单的方法可能是这样的:

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

【讨论】:

    【解决方案2】:

    既然您已经要求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(即覆盖对象,而不是指向它的指针)。仅当您讨厌维护代码的人时才这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-24
      相关资源
      最近更新 更多