使用智能指针的N元树设计

N-Ary Tree Design with Smart Pointers

本文关键字:智能 指针      更新时间:2023-10-16

我正试图用C++设计一个树类,但在节点销毁方面遇到了一些麻烦。

如果我破坏了一个节点,我不想破坏它的整个子树,因为可能有其他东西指向它。所以显而易见的解决方案是使用引用计数。我会有一个指向父节点的弱指针,以及一个指向子节点的共享指针向量。这样,如果一个节点被破坏,只有当没有任何东西指向它们时,它的子节点才会被破坏。

但我在这里遇到了另一个问题:向节点添加一个子节点。weak_ptr只有在已经有shared_ptr指向对象的情况下才有效。如果我向节点添加一个子节点,我不知道在哪里可以找到指向它的shared_ptr。那么我该怎么办呢?

要扩展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会采用类似的参数或是模板…)

您可能需要研究enable_shared_from_this,它允许您直接从对象中获取shared_ptr。它仍然要求对象由shared_ptr管理,但不需要找到持有它的