2017-01-16 3 views
0

この質問はここにこの質問のフォローアップの質問ですenable_shared_from_this:original questionセルフ

私はstd::enable_shared_from_thisから継承するクラスを持っていると、このクラスはstd::shared_ptr<Self>

が含まれています

クラスの詳細が完全で成功していることがわかった後、このクラスのコンストラクタのいずれかに格納されたstd::shared_ptr<Self>shared thisのものに割り当てるにはどうすればいいですか?

例:

class Self : public std::enable_shared_from_this<Self> { 
private: 
    std::shared_ptr<Self> me_; // Or 
    std::unique_ptr>Self> me_; 

public: 
    Self (/*some parameters*/); 
}; 

Self::Self(/* some parameters */) { 
    // Check parameters for creation 

    // Some work or initialization being done 

    // If all is successful and construction of this class is about 
    // to leave scope, then set the smart pointer to the this* 

    // How to do ... 
    me_ = std::enable_shared_from_this<Self>::shared_from_this(); 
    // Properly if this is even possible at all. 
} 
+0

@ Jason R oh okay。だから私は、それらのインスタンスを含む "マネージャー型のクラス"を持っている必要があるか、または私はそれを構造体や初期化関数などのコンストラクターの直後に呼び出される関数で設定する必要があります。 –

+0

自己へのshared_ptrは矛盾です。一時的にオブジェクトを生かしておくだけで便利です(例えば、コールバックを待つ間)。 –

答えて

2

あなたがすることはできません。その時点で、現在のSelfインスタンスを指しているshared_ptrはまだ存在しません。コンストラクタが復帰するまで存在する可能性はありません。 shared_from_this()には、thisを指すshared_ptrが既に存在するという前提条件があります。

+0

それは意味があります。ですから、私は、共有ポインタを含むマネージャクラスが必要になるか、またはcreate()メソッドやinit()メソッドなどのコンストラクタの後に呼び出される必要があるこのクラス内のメソッドを持つ必要があります。 –

+0

はい、そうです。 –

+0

ええ、図書館のこの部分を継承しているのは私にとって初めてのことです。 –

1

現在のオブジェクトを指す既存のstd::shared_ptrである必要があるため、できません。スコット・マイヤーズは、効果的な近代的なC++(19章)で言うように、あなたはあなたのコンストラクタはプライベート宣言し、std::shared_ptrを返すファクトリ関数を作る、などの可能性:

class Self: public std::enable_shared_from_this<Self> { 
public: 
// factory function that perfect-forwards args 
// to a private ctor 
    template<typename... Ts> 
    static std::shared_ptr<Self> create(Ts&&... params); 
    ... 
    void process(); 
    ... 
private: 
    ... // ctors 
}; 

そしてprocessを呼び出して、何かできることは:

void Self::process() 
{ 
    ... 
    me_ = shared_from_this(); 
} 
+0

私はそれが技術的に可能であると思う(悪いデザインかもしれないが)。 JasonRの[回答](http://stackoverflow.com/a/41683759/3246555)に私のコメントを参照してください。 – AlexD

関連する問題