2009-04-29 5 views
6

他を見る:Similar question* shared_ptrを使って*これを返すべきですか?

以下のコードは明らかに危険です。問題は、あなたは* thisへの参照をどのように把握していますか?

using namespace boost; 

// MyClass Definition 
class MyClass { 

public: 
    shared_ptr<OtherClass> createOtherClass() { 
     return shared_ptr<OtherClass> OtherClass(this); // baaad 
    } 
    MyClass(); 
    ~MyClass(); 
}; 

// OtherClass Definition 
class OtherClass { 

public: 
    OtherClass(const *MyClass myClass); 
    ~OtherClass(); 
}; 

// Call; pMyClass refcount = 1 
shared_ptr<MyClass> pMyClass(new MyClass()); 

// Call; pMyClass refcount = 1 => dangerous 
pMyClass->createOtherClass(); 

私は答え(下記掲載)を持っている(私が間違っている場合は、誰もが私を修正することができる場所。)、私はちょうどそれがstackoverflowの上になりたい

+1

よくある質問から投票している理由はわかりません。あなた自身のプログラミングに関する質問に答えることもできます。[..] –

+0

質問に投稿したコードが勝った可能性がありますコンパイルしないでください。 –

+0

残念ながら、ポイントはコンパイル可能なコードを提供するのではなく、不必要な詳細が省略された点を説明することでした。 –

答えて

7

キーはenable_shared_from_this<T>を拡張して使用することですshared_from_this()方法は*this

For detailed information

using namespace boost;  

// MyClass Definition 
class MyClass : public enable_shared_from_this<MyClass> { 

public: 
    shared_ptr< OtherClass> createOtherClass() { 
     return shared_ptr<OtherClass> OtherClass(shared_from_this()); 
    } 
    MyClass(); 
    ~MyClass(); 
}; 

// OtherClass Definition 
class OtherClass { 

public: 
    OtherClass(shared_ptr< const MyClass > myClass); 
    ~OtherClass(); 
}; 

// Call; pMyClass refcount = 1 
shared_ptr<MyClass> pMyClass(new MyClass()); 

// Call; pMyClass refcount = 2 
pMyClass->createOtherClass(); 
+0

説明をリンクする記事のために+1 –

1

問題のカップルにshared_ptrのを取得します:
コードがコンパイルされません。

あなたのコードは、それが虐待/間違った使用を停止したように設計されていません。

MyClass   x; 
SharedPtr<MyClass> y = x.createOtherClass(); 

今何?
これは完全に良いユースケースのようです!

+0

あなたの2番目のポイントは右です。リンクされた記事では、「shared_from_thisという名前のオブジェクトはshared_ptrオブジェクトが所有している必要があります。 ctorをプライベートにし、shared_ptr を返す名前付きコンストラクタ(静的メソッド)を用意して、正しい作成を実行するのに最適です。 – Dan

関連する問題