【问题标题】:How to gracefully copy two dissimilar structures in C++?如何在 C++ 中优雅地复制两个不同的结构?
【发布时间】:2015-03-06 06:42:31
【问题描述】:

我有两个不同的结构,有一些共同的元素。

    typedef struct X {
        struct X *next
        char X1[5];
    }

    typedef struct Y {
        unsigned char Y1;
        int Y2[5];
        bool Y3;
    }Y;

    typedef struct Z {
        unsigned char Z1;
        int Z2;
        X X1;
        Y Y1;
        struct Z *next;
    }Z;


    typedef struct A {
        unsigned char A1;
        char A2[20];
        X X1; 
        Y Y1;
    }


  typedef struct B {
        unsigned char B1;
        char B2[20];
        int B3;
        Z Z1; 
    }

我想复制 A 和 B,但我不想使用 reinterpret_cast,因为它有风险,并且代码会部署在多台机器上。请提出任何优雅的复制方法。

附:我不允许更改设计。 :(

【问题讨论】:

  • “我要复制A和B”是什么意思?是否要将 A 的实例复制到 B 的实例?还有什么?
  • 是的,我想将 B 的填充实例复制到 A。
  • 你希望它做什么?它们有不同的内容类型。
  • 你为什么不写一个在两个这样的结构之间复制的函数呢?这是最直接、干扰最小的方法。
  • @DavidSchwartz 和 Ulrich :一个一个地复制每个单独的元素,这是唯一的方法吗?我只是想知道是否存在更好的方法?

标签: c++ struct


【解决方案1】:

我想最优雅的方法是为AB 定义operator=,如下所示:

A & operator=(const B & b) {
    this->A1 = b.B1;
    memcpy(this->A2, b.B2, 20);
    // Handle X1, Y1, B3 and Z1 somehow - depending on your needs
}

那么你可以这样称呼它:

A a;
B b;
a = b;

无论如何,您需要分别处理每个元素。编译器无法猜测您想如何处理不同类型的数据属性。

您可以进一步自动化该过程,例如为Z 创建一个构造函数,该构造函数将采用XY 的实例。

另外,请记住,提供复制构造函数和赋值运算符是一个很好的做法。

【讨论】:

  • 实际上,你甚至可以在 memcopy 调用中包含 A1 的内存,但我认为没有理由这样做。
  • 添加到@MikeMB,总是更喜欢复制构造方法。它更明确。运算符重载通常用于特定于对象,而复制构造函数用于您的目的。看看丹尼尔在here的回答
【解决方案2】:

如果你想要便携,你必须逐个元素地做。

例如,您可以将带有签名A(const B& b) 的构造函数添加到A,并让该构造函数将各个字段从b 复制到this。然后对子结构做同样的事情。

【讨论】:

  • 嗨@O'Brien:我也在考虑复制单个元素的相同行。但除此之外还有什么办法吗??
  • 不,如果你想便携,你必须逐个元素地做。
猜你喜欢
  • 2019-11-24
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-15
  • 2019-06-27
  • 1970-01-01
相关资源
最近更新 更多