2012-01-24 10 views
3

は、私が持っていると言う:C++でアプリケーション上で「this」インスタンスを共有するにはどうすればよいですか?

class Foo 
{ 
public: 
    Foo(std::function< void(std::shared_ptr<Foo>) > callback); 

    void shareMyFoo() 
    { 
     callback(std::make_shared<Foo>(this)); 
    } 

    .... 
}; 

shareMyFoo()が呼び出されると、誰かが共有ポインタをコピーする機会を持つことになります。残念ながら、それは死ぬだろう - つまり、そのrefカウンタが0に落ちた、それは私のFooを殺すでしょう。私はFooが自殺しないようにしたいと思います。

フィールドstd::shared_ptr<Foo> sharedSelf_Fooに入れると思っていましたが、これはコンストラクタで初期化しますが、それも安いです。

は、より一般的に、私はインスタンス化想像すると(例えばauto foo = std::make_shared<Foo>())、共有ポインタ内のオブジェクトへのポインタを格納し、以降のインスタンスは、共有ポインタとして自身を通過することを望みます。 refカウンタをグローバルに更新するにはどうすればよいですか?

N.B.:私の署名/私のshared_ptr引数を自分のアプリケーションに保存したい/したい。

答えて

3

std::enable_shared_from_this(n3242§20.7.2.4)から継承する必要があります。

auto p = (new Foo) -> shared_from_this(); 
+0

を見て! –

+0

'auto p =(new Foo) - > shared_from_this();'それは何ですか? – ronag

+0

* *はN3242のコード例です。 – spraff

3

あなたは私の一日行わenable_shared_from_this

class Foo : public std::enable_shared_from_this<Foo> 
{ 
    Foo(std::function< void(std::shared_ptr<Foo>) > callback); 
public: 
    std::shared_ptr<Foo> create(std::function< void(std::shared_ptr<Foo>) > callback) 
    { 
     return std::shared_ptr<Foo>(new Foo(std::move(callback))); 
    } 

    void shareMyFoo() 
    { 
     callback(shared_from_this()); 
    } 
}; 
関連する問題