web-dev-qa-db-ja.com

boost :: shared_ptrと動的キャスト

基本クラスのshared_ptrの使用に問題があり、逆参照するときに派生クラスのメソッドを呼び出すことができないようです。コードは私よりも冗長になると思います。

class Base : public boost::enable_shared_from_this<Base>
{
  public:
    typedef  boost::shared_ptr<BabelNet> pointer;
};

class Derived : public Base
{
  public:
     static pointer  create()
                {
                        return pointer(new Derived);
                }
     void             anyMethod()
     {
        Base::pointer foo = Derived::create();
        // I can't call any method of Derived with foo
        // How can I manage to do this ?
        // is dynamic_cast a valid answer ?
        foo->derivedMethod(); // -> compilation fail
     }

};
15
HolyLa

static_cast with boost :: shared_ptr? を参照してください

適切なshared_ptrインスタンス化を取得するには、 dynamic_pointer_cast を使用する必要があります。 (dynamic_castに対応)

19
lijie

共有ポインターであるかどうかにかかわらず、Baseへのポインターがある場合、メンバー関数を呼び出すことができるのはBaseからのみです。

本当にdynamic_castが必要な場合は、 boost からdynamic_pointer_castを使用できますが、そうすべきではない可能性があります。代わりに、あなたのデザインについて考えてください:DerivedBaseであり、これは非常に強い関係なので、考えてみてくださいBaseインターフェイスについて注意深く、具体的なタイプを本当に知る必要があるかどうか。

4
icecrime

派生メソッドが基本クラス(仮想かどうか)で宣言されていない場合、コンパイルが失敗するのは正常です。共有ptrは、(保持するポインターを介して)基本クラスを認識して使用し、派生クラスとその特定のメソッドについては何も知りません。

1

あなたのコードは生のポインタでも機能しません。

基本クラスでもderivedMethod()メソッドを宣言するか、Derivedオブジェクトへのポインタを用意する必要があります。

0
Simone