假设我有一个用节点类实现的树数据结构:
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而不是那么热情地提升)
答案 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。它的设计考虑了这些用例。我看到你的代码问题是指向父代的指针。我认为这不能简单地实施。但是你将免费获得内存管理。