将所有成员从结构复制到另一个结构

时间:2015-12-18 20:24:42

标签: c++ struct

在C ++中,我有两个结构(假设所有成员都是公共的):

struct A{
   t1 d1;
   t2 d2;
   t3 d3;
   ...
   t100 d100;
};

struct B{
   t7 d7;
   t3 d3;
   t5 d5;
};

B中的成员是A成员的子集。

现在我需要一个函数将所有成员从B复制到A:

func(A a, B b) {
    a.d7 = b.d7;
    a.d3 = b.d3;
    a.d5 = b.d5;
}

在未明确列出所有func成员的情况下,实施B的优雅方式是什么?授予A是固定的,无法修改。

3 个答案:

答案 0 :(得分:1)

如果你被允许改变A,你可以表达A和B之间的结构关系:

  • A可以继承自B,如果A实际上是一种B.你可以从A中删除公共元素(因为它们是从B继承的)。

  • A可以有一个B成员替换公共元素。

在这种情况下,您可以享受=的使用(在第一种情况下,您有意使用切片,在第二种情况下,这将是一个干净的任务)。

如果你不能表达结构关系,那么就没有一般的安全方法,但是你有一份分配清单。

您不应该考虑memcopy()方法或类似方法,因为您无法确定元素是否具有相同的对齐方式。如果它不是POD元素,这可能会导致未定义的行为(内存泄漏,损坏,虚函数表损坏等等)。

答案 1 :(得分:0)

您给出的示例:

func(A a, B b) {
    a.d7 = b.d7;
    a.d3 = b.d3;
    a.d5 = b.d5;
}

看起来像一个宏的好地方:

func(A a, B b) {
#define c(f) a.f = b.f
    c(d7);
    c(d3);
    c(d5);
#undef c
}

答案 2 :(得分:0)

  

在未明确列出所有func成员的情况下实施B的优雅方式是什么?

在你的情况下,没有别的办法。

如果你使用C ++并且struct A是可修改的,那么你可以使用class并利用已经存在的优雅复制构造函数:

class_name (const class_name & class_object)

和复制作业:

class_name & class_name::operator= (const class_name & class_object)

以下是copy constructorcopy assignment进一步阅读的链接。