2017-03-27 25 views
1

私はshared_from_this関数でこれに共有ptrを作成しようとしています。shared_from_this派生クラス

#include <iostream> 
#include <memory> 

class foo { 
public: 
    virtual void method() { 
     std::cerr << "foo::method()" << std::endl; 
    } 
}; 

class foo_derived : public foo, public std::enable_shared_from_this<foo> { 
public: 
    void method() override { 
     auto self(shared_from_this()); 
     std::cerr << "foo_derived::method" << std::endl; 
    } 
}; 

int main() { 
    foo_derived().method(); 
} 

ラインauto self(shared_from_this()); からこのコード投げbad_weak_ptr私はこの問題は、自己が派生クラスで作成されているという事実であると思います。 私はこの動作の説明を探していますが、派生クラスで有効なshared_from_thisの使用例もありがとうと思います。

答えて

2

これは継承とは関係ありません。この方法ではなく動作しますmethodを呼び出します。std::make_shared<foo_derived>()->method();

cppreference std::enable_shared_from_this::shared_from_this

すなわち、STDによって管理対象オブジェクトで、唯一以前に共有 オブジェクトにshared_from_this を呼び出すことが許可されている:: shared_ptrの。それ以外の場合は、 の動作は(C++ 17まで)std :: bad_weak_ptrがスローされます( shared_ptrコンストラクタによってデフォルト設定のweak_thisからスローされます)( C++ 17以降)。