問題タブ [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.

0 投票する
0 に答える
31 参照

c++ - オブジェクトの初期化中のスマート ポインターとの所有権の共有

Aclassへのメンバーポインタを持つクラスがありますB:

私のmain関数では、shared_ptrof クラスを作成し、A両方のクラスのいくつかのメソッドを使用します。

ただし、 のメソッドを使用する前にB、ポインターfunc1()をリセットしたいと思います。spAしかし、オブジェクトspAが指しているが、まだ破棄することは許可されていません ( が指すオブジェクトはのメンバーのspB一部に対する参照を保持できるため、設計要件)。A

それができるようにするために、Bへのポインターも保持できると思いました。しかし、はのコンストラクターから作成されるため、まだ初期化するオブジェクトはありません。AA* m_ABAAm_A

のコンストラクターを に渡しthisても問題は解決しません。これは、 の最初の行で作成された と所有権を共有しないためです。AcreateB(this)spAmain()spAspA.reset()

私が持っていた別の選択肢は、を作成することでしm_Aたが、オブジェクトがまだ作成されていないため、のコンストラクターをに渡すshared_ptrことは不可能です。shared_from_this()AcreateB(this->shared_from_this())A

この問題を解決する方法について何か提案はありますか?

0 投票する
2 に答える
148 参照

c++ - 別のオブジェクトが存在する限り、あるオブジェクトを存続させる方法は?

2番目のオブジェクトのクラスに最初のオブジェクトを明示的に認識させずに、別のオブジェクトがまだ存在している間に特定のオブジェクトが破壊されるのを防ぐ方法はありますか?

次に例を示します。

の後spA.reset()、 が指すオブジェクトへの参照が少なくとも 1 つ必要spAです。spAまたは、言い換えると、 を呼び出した後でのみ、 が指すオブジェクトを破棄したいと考えていますspB->DoSomething()

ただし、重要な前提条件として、B「知る」Aことが許可されていません (たとえば、ポインター/参照を保持することは許可されていません)。

私が理解しているように、共有ポインターはこの問題の処理に役立ついくつかの機能を提供しますが、どれがどれかはわかりません。

編集:

との簡単な構造は次のようにAなりBます。

EDIT2(私の解決策):

そのため、@MSalters から提供された提案を使用して、自分に合った解決策を見つけることができました。この場合、調整するだけでよいように、予想よりもはるかに単純でしたA::getB()

ここでは、単に を返す代わりに、 (エイリアス コンストラクターを使用して)型の共有ポインターを作成して返しますm_B。これは、オブジェクト ( によって提供される)の参照カウントに影響を与えます。そのため、呼び出しが2 つから 1 つに減り、呼び出しが可能になります。を使用するには、から継承する必要があります:A::getB()spBAliasBAthis->shared_from_this()spA.reset()mainspAspB->DoSomething()shared_from_this()Astd::enable_shared_from_this<A>