我正在尝试编写一个复制构造函数,它采用四叉树的一个节点,并复制该节点及其所有子节点,等等。这是我拥有的:
Node(const Node & n) {
nChild=new Node(*(n.nwChild));
neChild=new Node(*(n.nChild));
eChild=new Node(*(n.seChild));
wChild=new Node(*(n.sChild));
}
我觉得最后 4 行有点古怪。我的做法有意义吗?
最佳答案
您的构造函数不是异常安全的 - 假设第二个 new
抛出 bad_alloc
,那么第一个将如何清理?
通过将 Child
字段更改为您最喜欢的智能指针,您可能会让自己的生活更轻松。如果您没有最喜欢的智能指针,请介绍一下自己;-)
[编辑:刚刚注意到您没有提供数据成员定义,我只是假设它们是原始指针。如果它们已经是智能指针,我们深表歉意。]
提前输出看起来有点奇怪——如果 rhs 上的所有四个 child 都为 NULL,那么 x/y/height/width 怎么没有被复制?通常这些成员将由初始化列表处理。如果任何 子级为 NULL,而不是所有,您是否应该做一些特别的事情?目前你不处理一个方向有 child 的节点,但不是所有 4 个。如果你的树的一个属性是每个节点有 4 个 child 或没有,那么你不需要检查所有 4 个,但你 复制叶节点时是否需要初始化各个字段。如果一个节点可能恰好有 1 个子节点,那么您没有正确复制该节点。
除此之外,基本逻辑对我来说似乎没问题,如果没有任何问题,它将递归复制。
关于c++ - 递归复制构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5333159/