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

0 投票する
3 に答える
1301 参照

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

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

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 を必要とするように?

0 投票する
3 に答える
6892 参照

c++ - shared_from_this と多重継承を促進する

現在、ブーストenable_shared_from_thisと多重継承を使用するときにいくつかの問題が発生しています。

このシナリオは次のように説明できます。

  1. クラスAはいくつかの機能を実装し、から継承する必要がありますenable_shared_from_this

  2. クラスBは別の機能を実装しており、から継承する必要がありますenable_shared_from_this

  3. クラスはand ( )Dから機能を継承しますABclass D : public A, public B {}

  4. クラスから一部のクラスB機能を使用するDと、例外が発生しました ( bad_weak_ptr)

  5. enable_shared_from_thisクラスから継承することDは私にとって選択肢ではありません

これを解決する方法がわかりません。

ああ、私は Visual C++ 2010 を使用しています。

0 投票する
3 に答える
9903 参照

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トリックを使うべきですか?

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

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 を内部に格納された弱参照に割り当てます。

ええ、どうやって?

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

c++ - enable_shared_from_this なしで shared_from_this を実装できますか?

を使用する場合、いくつかのエッジケースがあるようですenabled_shared_from_this。例えば:

shared_from_this と多重継承を促進する

shared_from_thisを使用せずに実装できますenable_shared_from_thisか? もしそうなら、それは速くすることができますか?

0 投票する
3 に答える
6149 参照

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_ptrshared_ptr