0

C ++でツリークラスを設計しようとしていますが、ノードの破棄で問題が発生しています。

ノードを破棄する場合、他のポイントが指定されている可能性があるため、サブツリー全体を破棄したくありません。したがって、明らかな解決策は、参照カウントを使用することです。親への弱いポインターと、子ノードへの共有ポインターのベクトルがあります。そうすれば、ノードが破壊された場合、その子は何もポイントしていない場合にのみ破壊されます。

しかし、ここで別の問題が発生します。ノードに子を追加することです。weak_ptrは、オブジェクトを指すshared_ptrがすでに存在する場合にのみ機能します。また、ノードに子を追加すると、そのノードを指しているshared_ptrがどこにあるかわかりません。だから私はここで何をしますか?

4

2 に答える 2

2

オブジェクトから直接enable_shared_from_this取得できるようにすることを検討することをお勧めします。shared_ptrそれでも、オブジェクトはによって管理される必要がありますが、誰がそれを保持しているかを見つけるshared_ptr必要はありません。

于 2012-08-27T00:22:13.173 に答える
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 に答える