class node{
private:
node* parent;
node* leftchild;
node* rightchild;
// etc....
}
我不想用析构函数创建一个无限循环,这就是为什么我感兴趣的如何为它做一个好的构造函数。
答案 0 :(得分:0)
在delete
的指针上调用NULL
将不会调用析构函数
只需在构造函数中将节点设置为NULL
,并且只有在它们存在时才分配它们。
因此可以安全地删除析构函数中的子对象,导致'链''当它到达NULL
的子节点时将停止。
示例:
#include <iostream>
class Node{
public:
Node() {
node = NULL;
}
~Node() {
std::cout << "Deleting" << std::endl;
delete node;
}
void CreateChildNode() {
node = new Node();
}
private:
Node* node;
};
int main()
{
Node *n = new Node();
n->CreateChildNode();
delete n;
return 0;
}
上面的代码片段将输出:
删除
正在删除
答案 1 :(得分:0)
我会说:
node::~node()
{
// remove reference to this from neighboor.
if (leftchild) {
leftchild->parent = nullptr;
}
if (rightchild) {
rightchild->parent = nullptr;
}
if (parent) {
if (parent->leftchild == this) {
parent->leftchild = nullptr;
} else {
parent->rightchild = nullptr;
}
}
}
std::shared_ptr
/(std::weak_ptr
,std::unique_ptr
)的正确smartPointer(parent
/ leftchild
或指针/ rightchild
)。< / p>