在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是基于你的代码的上下文。