【发布时间】:2012-08-21 12:39:15
【问题描述】:
我正在尝试用 C++ 设计一个树类,但在节点破坏方面遇到了一些麻烦。
如果我销毁一个节点,我不想销毁它的整个子树,因为可能有其他东西指向它。所以显而易见的解决方案是使用引用计数。我有一个指向父节点的弱指针,以及一个指向子节点的共享指针向量。这样,如果一个节点被销毁,它的子节点只有在没有指向它们的情况下才会被销毁。
但我在这里遇到了另一个问题:向节点添加子节点。 weak_ptr 仅在已经存在指向对象的 shared_ptr 时才有效。如果我将一个子节点添加到一个节点,我不知道在哪里可以找到指向它的 shared_ptr。那我在这里做什么呢?
【问题讨论】:
-
每个孩子都有父母吗?
-
每个孩子都有一个父成员,但根没有父成员。
-
我的意思是逻辑上,而不是代码上。每个孩子都有会员吗?如果是这样,那么在您的实现中,每个孩子都已经存在于其父母的孩子的向量中,因此您可以从中获取共享指针。 (虽然我没有 100% 理解为什么你首先需要共享所有权......)
-
@KerrekSB:虽然这可能是真的,但在添加节点时需要在层次结构中向上走两级(如果父节点不是根节点,则必须特殊情况)然后遍历子元素列表,直到找到指向挂起新元素的节点的智能指针。
-
如果我的代码中已经有一个引人注目的用例,我真的只会实现它。我还没有看到销毁节点而不是其子树的情况会很有意义。无论如何,这对子树意味着什么?所有的孩子都会成为根吗?
标签: c++ tree smart-pointers