2012-01-24 14 views
2

次の例を示します。子ウィンドウを持つことができるウィンドウクラスがあるとします。各子ウィンドウには親ウィンドウへの弱いポインタがあり、各ウィンドウにはその子への共有ptrsのリストがあります。子ウィンドウが破棄された場合、親ウィンドウが閉じられたか、または子ウィンドウ自体が閉じられたかによって破壊されたかどうかはわかりません。この中C++:例外的でない状況で例外を使用する理由はありますか

//we try to retain the parent window here 
try 
{ 
    //creates a shared pointer from the weak pointer, throws BadReferenceCounterException on fail 
    WindowPtr parent = m_parentWindow.retain(); 

    //check if there is a parent at all, otherwise 0 
    if(parent) 
    { 
     parent->removeChildWindow(this); 
    } 
    } 
    catch(const BadReferenceCounterException & _ec) 
    { 
    std::cout<<"Catched expected exception, if Parent was closed before me!"<<std::endl; 
    } 

:したがって、私が思いついた解決策は、try {}キャッチで子ウィンドウのデストラクタで親ウィンドウ弱いポインタデリファレンス{}親ウィンドウはまだ(擬似コード)が存在するかどうかを確認するためにブロックするようにしました状況デストラクタが呼び出されたコンテキストを知る方法がないため、これを単純に解決する別の方法は考えられませんでした。私はある種の予想される状況で例外を使用するので、これは愚かなことですか?私はあなたがパフォーマンスクリティカルなコードでやりたいことではないことを知っています。だから、これは質問のポイントではありません。

ありがとうございました!

+3

サウンドに与えてくれたコードサンプルをチェックアウトすることができます

typedef std::shared_ptr<Window> WindowPtr; typedef std::weak_ptr<Window> WeakWindowPtr; WeakWindowPtr m_parentWindow; //... WindowPtr parent = m_parentWindow.lock(); if (parent) { // here you know parent wasn't destroyed and you can access it via parent } 

:標準(両方ともC++ 11とでブーストで)共有/弱いポインタを使用すると、例外なしにそれを行うことができ私には聖なる戦争領域のように。私は最初のボレーをロブします:あなたの弱点は、捨てることなくその妥当性をチェックすることができます。 'boost :: weak_ptr :: lock'はそのようなアクセスでヌル' boost :: shared_ptr'を返します。 – Managu

+0

@moka:「有効」とはどういう意味ですか? –

+0

希望通りに機能しますか?十分に実行しますか?それは理解できますか?その後、有効な解決策、IMHOです。 – Managu

答えて

5

あなたは間違った共有/弱いポインタのペアを使用しているようです。あなたはまた、私はthis stackoverflow answer

+0

そして、C++構文の便利な特質のために 'if(WindowPtr parent = m_parentWindow.lock()){/ * parent * /}を使う'と 'parent'はちょうど正しいスコープを持つと言うことができます。 – bames53

関連する問題