問題タブ [ownership-semantics]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - オブジェクトの初期化中のスマート ポインターとの所有権の共有
A
classへのメンバーポインタを持つクラスがありますB
:
私のmain
関数では、shared_ptr
of クラスを作成し、A
両方のクラスのいくつかのメソッドを使用します。
ただし、 のメソッドを使用する前にB
、ポインターfunc1()
をリセットしたいと思います。spA
しかし、オブジェクトspA
が指しているが、まだ破棄することは許可されていません ( が指すオブジェクトはのメンバーのspB
一部に対する参照を保持できるため、設計要件)。A
それができるようにするために、B
へのポインターも保持できると思いました。しかし、はのコンストラクターから作成されるため、まだ初期化するオブジェクトはありません。A
A* m_A
B
A
A
m_A
のコンストラクターを に渡しthis
ても問題は解決しません。これは、 の最初の行で作成された と所有権を共有しないためです。A
createB(this)
spA
main()
spA
spA.reset()
私が持っていた別の選択肢は、を作成することでしm_A
たが、オブジェクトがまだ作成されていないため、のコンストラクターをに渡すshared_ptr
ことは不可能です。shared_from_this()
A
createB(this->shared_from_this())
A
この問題を解決する方法について何か提案はありますか?
c++ - 別のオブジェクトが存在する限り、あるオブジェクトを存続させる方法は?
2番目のオブジェクトのクラスに最初のオブジェクトを明示的に認識させずに、別のオブジェクトがまだ存在している間に特定のオブジェクトが破壊されるのを防ぐ方法はありますか?
次に例を示します。
の後spA.reset()
、 が指すオブジェクトへの参照が少なくとも 1 つ必要spA
です。spA
または、言い換えると、 を呼び出した後でのみ、 が指すオブジェクトを破棄したいと考えていますspB->DoSomething()
。
ただし、重要な前提条件として、B
「知る」A
ことが許可されていません (たとえば、ポインター/参照を保持することは許可されていません)。
私が理解しているように、共有ポインターはこの問題の処理に役立ついくつかの機能を提供しますが、どれがどれかはわかりません。
編集:
との簡単な構造は次のようにA
なりB
ます。
EDIT2(私の解決策):
そのため、@MSalters から提供された提案を使用して、自分に合った解決策を見つけることができました。この場合、調整するだけでよいように、予想よりもはるかに単純でしたA::getB()
。
ここでは、単に を返す代わりに、 (エイリアス コンストラクターを使用して)型の共有ポインターを作成して返しますm_B
。これは、オブジェクト ( によって提供される)の参照カウントに影響を与えます。そのため、呼び出しが2 つから 1 つに減り、呼び出しが可能になります。を使用するには、から継承する必要があります:A::getB()
spBAlias
B
A
this->shared_from_this()
spA.reset()
main
spA
spB->DoSomething()
shared_from_this()
A
std::enable_shared_from_this<A>