0

我正在尝试在 C++ 中设计一个树类,但在节点破坏方面遇到了一些麻烦。

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

但是我在这里遇到了另一个问题:向节点添加子节点。weak_ptr 仅在已经存在指向对象的 shared_ptr 时才有效。如果我将一个子节点添加到一个节点,我不知道在哪里可以找到指向它的 shared_ptr。那么我在这里做什么呢?

4

2 回答 2

2

为了扩展 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会采用类似的参数或作为模板......)

于 2012-08-27T00:34:02.773 回答
2

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

于 2012-08-27T00:22:13.173 回答