問題タブ [enable-shared-from-this]
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++ - enable_shared_from_thisが、参照カウンターを直接埋め込むのではなく、弱いポインターを埋め込むのはなぜですか?
ヘルパーにはenable_shared_from_this
、オブジェクトへの共有ポインターを作成するときに設定される弱いポインターが含まれています。これは、参照カウント(個別に、またはを使用してオブジェクトと一緒に割り当てられるmake_shared
)とオブジェクトに余分なものがあることを意味weak_ptr
します。
では、なぜ代わりに参照カウントが含まれていないのですか?ダムポインタから設定する場合shared_ptr
は、型を完全に定義する必要があるため、shared_ptr
コンストラクタまたは代入演算子は、型が派生していることを検出しenable_shared_from_this
て正しいカウンタを使用でき、形式は同じままであるため、コピーは関係ありません。実際、shared_ptr
埋め込みを設定するには、すでにそれを検出する必要がありますweak_ptr
。
c++ - 基本クラスと派生クラスの両方がboost::enable_shared_from_thisから継承する場合の悪い弱いポインター
boost::enable_shared_from_this から派生した基本クラスがあり、基本クラスと boost::enable_shared_from_this の両方から派生した別のクラスがあります。
これはコンパイルされますが、実行時に
これを引き起こしているのは何ですか、それを回避する方法はありますか?
編集:
次のようなものが必要な場合:
A と B の両方が独自に shared_from_this を必要とし (そして一方が他方から継承することはできません)、C が A、B、および shared_from_this を必要とするように?
c++ - shared_from_this と多重継承を促進する
現在、ブーストenable_shared_from_this
と多重継承を使用するときにいくつかの問題が発生しています。
このシナリオは次のように説明できます。
クラス
A
はいくつかの機能を実装し、から継承する必要がありますenable_shared_from_this
クラス
B
は別の機能を実装しており、から継承する必要がありますenable_shared_from_this
クラスはand ( )
D
から機能を継承しますA
B
class D : public A, public B {}
クラスから一部のクラス
B
機能を使用するD
と、例外が発生しました (bad_weak_ptr
)enable_shared_from_this
クラスから継承することD
は私にとって選択肢ではありません
これを解決する方法がわかりません。
ああ、私は Visual C++ 2010 を使用しています。
c++ - enable_shared_from_this の二重継承
他の 2 つのオブジェクト (A と B) から派生したオブジェクト (Z) があります。
enable_shared_from_this<>
A と B は、それぞれenable_shared_from_this<A>
とから派生しenable_shared_from_this<B>
ます。
もちろん、私はshared_from_this()
Z を呼び出します。もちろん、コンパイラはこれをあいまいであると報告します。
私の質問は次のとおりです。
- から2回継承しても安全ですか、
enable_shared_from_this<>
それとも2つの別々の参照カウントを作成しますか(悪い!) - 安全でない場合、どうすれば解決できますか?
注:基本クラスと派生クラスの両方がboost::enable_shared_from_thisから継承する場合、この他の質問の悪い弱いポインタを見つけましたが、実際には答えません。私もvirtual
トリックを使うべきですか?
c++ - shared_ptr はどのようにT が enable_shared_from_this から派生していることを検出する?
shared_ptr をゼロから実装してどのように機能するかを学ぼうとしていますが、T の基底クラスを検出する方法がわかりません。
is_base_of() を使用してみましたが、const 値が得られ、if ステートメントで使用してオブジェクトの内部の weak_ptr を設定することはできません。
私はこれらの線に沿って考えていました:
しかし、これまでのところ運がありません。Boost と VC++ の実装は私にはわかりにくいので、簡単な説明を探しています。
ここでそれは言います
std::shared_ptr のコンストラクターは enable_shared_from_this ベースの存在を検出し、新しく作成された std::shared_ptr を内部に格納された弱参照に割り当てます。
ええ、どうやって?
c++ - enable_shared_from_this なしで shared_from_this を実装できますか?
を使用する場合、いくつかのエッジケースがあるようですenabled_shared_from_this
。例えば:
shared_from_this
を使用せずに実装できますenable_shared_from_this
か? もしそうなら、それは速くすることができますか?
c++ - いつ std::enable_shared_from_this を使用する必要があるか
私はこのリンクから知っていstd::enable_shared_from_this
ました。
しかし、以下のコードを読んだ後、いつ使用するかわかりません。
shared_ptr
を呼び出す前に存在しないため、上記のコードは「あまり良くありません」getptr()
。したがって、良いことは次のとおりです。
ただし、既にオブジェクトを持っている場合は、次のshared_ptr
ように単純にコーディングしてみませんか: std::shared_ptr<Good> gp2 = gp1;
、つまり、まったく必要ないということですstd::enable_shared_from_this
。
私の意見では、二重削除の問題std::enable_shared_from_this
を回避できるように、複数のshared_ptr
オブジェクトが同じ制御ブロックを持っていることを確認するために使用します。しかし、最初にa を作成することを思い出さなければならない場合は、生のポインターを使用する代わりに、オブジェクトを使用して新しいオブジェクトを作成することを思い出してください。shared_ptr
shared_ptr