10

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

4

3 に答える 3

15

はい、基本クラスと派生クラスの両方がboost :: enable_shared_from_thisから継承する場合の悪い弱いポインタによると、解決策は仮想継承を使用することです。C ++ 11標準shared_ptr(Boostではない)の実装は次のとおりです。

#include <memory>

struct virtual_enable_shared_from_this_base:
   std::enable_shared_from_this<virtual_enable_shared_from_this_base> {
   virtual ~virtual_enable_shared_from_this_base() {}
};
template<typename T>
struct virtual_enable_shared_from_this:
virtual virtual_enable_shared_from_this_base {
   std::shared_ptr<T> shared_from_this() {
      return std::dynamic_pointer_cast<T>(
         virtual_enable_shared_from_this_base::shared_from_this());
   }
};

struct A: virtual_enable_shared_from_this<A> {};
struct B: virtual_enable_shared_from_this<B> {};
struct Z: A, B { };
int main() {
   std::shared_ptr<Z> z = std::make_shared<Z>();
   std::shared_ptr<B> b = z->B::shared_from_this();
}

これはデフォルトの実装の一部ではありません。おそらく仮想継承のオーバーヘッドが原因です。

于 2013-03-21T14:27:50.260 に答える
1

はい、クラスは2つの異なるクラスenable_shared_from_this<A>とから派生し、2enable_shared_from_this<B>つの異なる弱参照があります

その答えからのトリックは、仮想継承のために1つの基本クラスを持つことを可能にします

于 2013-03-21T14:20:00.250 に答える