我正在尝试用C ++设计一个树类,但是我遇到了一些破坏节点的问题。
如果我销毁一个节点,我不想破坏它的整个子树,因为可能还有其他东西指向它。所以显而易见的解决方案是使用引用计数。我有一个指向父节点的弱指针,以及一个指向子节点的共享指针向量。这样,如果一个节点被销毁,它的子节点只有在没有任何东西指向它们的情况下才会被销毁。
但是我遇到了另一个问题:将一个孩子添加到一个节点。 weak_ptr仅在已经指向对象的shared_ptr时才有效。如果我将一个子节点添加到节点,我不知道在哪里找到指向它的shared_ptr。那我该怎么办?
答案 0 :(得分:2)
您可能希望查看允许您直接从对象获取enable_shared_from_this
的{{1}}。它仍然要求对象由shared_ptr
管理,但您不需要查找持有它的人。
答案 1 :(得分:1)
为了扩展David Rodriguez的想法,骨架树可能看起来像这样:
struct node : std::enable_shared_from_this<node>
{
std::vector<std::shared_ptr<node>> children;
std::weak_ptr<node> parent;
void add_child()
{
auto n = std::make_shared_node>();
n->parent = std::weak_ptr<node>(shared_from_this());
children.emplace_back(n);
}
}
auto root = std::make_shared<node>();
root.add_child();
root.add_child();
root.add_child();
root.children[0].add_child();
(当然,真实世界node
会有一个带有有效载荷值的非平凡构造函数,而add_child
会采用类似的参数或作为模板......)