没有样板复制代码的C ++中树数据结构的深层副本?

时间:2014-05-05 21:32:04

标签: c++ c++11 copy-constructor deep-copy assignment-operator

假设我有一个用节点类实现的树数据结构:

class Node
{
  Node * parent;
  std::vector<Node*> children;
  int data_1;
  std::string data_2;
  double data_3;
  ...
  float data_n;
};

要进行深层复制,有没有办法绕过编写非指针属性的所有样板复制?所有的

that.data_1 = this->data_1;
that.data_2 = this->data_2;
...
that.data_n = this->data_n;

我事先知道指针属性的数量很小,不会改变。但是,非指针属性更大,并且随着我开发程序而波动。因此,我每次添加新属性时都要避免记住添加此样板代码。

(我愿意使用C ++ 11而不是那么热情地提升)

3 个答案:

答案 0 :(得分:1)

正如在注释中暗示的那样,您可以将数据包装在结构中,然后只需复制一个结构并处理复制构造函数体中的其余复制过程:

class Node
{
  Node * parent;
  std::vector<Node*> children;
  //... maybe more

  struct Data {
      int data_1;
      std::string data_2;
      double data_3;
      ...
      float data_n;
  }
  Data data;
  Node( Node const& other) : data( other.data) {
      //... do the rest
  }
};

答案 1 :(得分:0)

您可以将有效负载放在基类中:

struct i {
        i(int a, float b) : a(a), b(b) {}
        int a;
        float b;
};

struct n : i {
        using i::i;
        n(const n&r) : i(r) {}
};

n N {1,1.0};

int main()
{
        n M {0,1.0};
        M=N;
        return M.a;
}

还有其他优点,我喜欢将内容与结构分开。

答案 2 :(得分:0)

如果您只需要一个递归容器,则可以使用Boost.Container。它的设计考虑了这些用例。我看到你的代码问题是指向父代的指针。我认为这不能简单地实施。但是你将免费获得内存管理。