1

独自の型から子を管理するクラスが付与され、各子はその親に戻るポインターを持ちます。

class Class {
    std::array<std::shared_ptr<Class>, 4> children;
    std::weak_ptr<Class> parent;
}

上記のコードのようなAweak_ptrは、共有 ptr を介して初期化する必要があるため、機能しません。

void initChild() {
    subtrees[0] = std::make_shared<Class>(std::shared_ptr<Class>(this));
}

これは明らかに削除thisされ、エラーになります。

raw を使用せずに親への弱い参照を持つ可能性はありpointersますか、それが唯一の選択肢でしょうか?

4

2 に答える 2

0

親ポインターを監視可能なメンバーとして使用している場合 (つまり、割り当て/破棄する必要があるものではない場合)、生のポインターが唯一の方法です。

于 2013-09-01T23:37:26.267 に答える
0

使用したくないが、何らかの理由でshared_from_this使用したいshared_ptr場合weak_ptrは、 Class オブジェクトを構築するファクトリ メソッドを作成し、外部からメンバー (親と子) をセットアップできます。

template<class... Args>
shared_ptr<Class> make_class(shared_ptr<Class> parent, size_t childIndex, Args&&... args)
{
      auto p = make_shared<Class>(forward<Args>(args)...);
      p->parent = parent;
      parent->children[childIndex] = p;
      return p;
}

もちろん、このメソッドを静的メンバ関数にして、コンストラクタを非公開にして、ユーザーが常にファクトリ メソッドを使用するようにすることもできます。

問題はshared_from_this、ターゲット クラスshared_ptrがないと、生のポインターから既に共有されているオブジェクトへの参照カウントを見つけることができないことです。

于 2013-09-02T01:19:15.227 に答える