2012-05-07 2 views
0

と仮定構造体:環状コンストラクタ

struct A 
{ 
    B& b_; 
    static A& shared_a() { ... } 
    A() : b_(B::shared_b()) { ... } 
}; 

struct B 
{ 
    A& a_; 
    static B& shared_b() { ... } 
    B() : a_(A::shared_a()) { ... } 
}; 

コードをコンパイルするようにファイル構造が編成されると仮定する。

A :: shared_aが初めて呼び出されると、Aの共有インスタンスが構築されます.Aの共有インスタンスのコンストラクタはB :: shared_bを呼び出し、Bの共有インスタンスを作成します。次に、 Bの共有インスタンスのコンストラクタはA :: shared_aを呼び出します。ただし、Aの共有インスタンスはコンストラクタを終了していません。したがって、これらのコンストラクタは無限にループします。

このようなループを防ぐために、クラスAとクラスBをマージすることができましたが、そうしないでください。より洗練されたソリューションはありますか?あなたは(shared_aを与える方法について

おかげで、

サム

+0

無限ループの問題を確認しましたか? – jdizzle

答えて

1

コードには未定義の動作があり、あなたが言及している無限ループまたはその他の奇妙な動作が発生する可能性があります。さて、問題はそれをどのように解決するかではなく、通常はコードの匂いである周期的な依存関係を壊します。

あなたの設計が意味をなさないと確信していて、コンストラクタが(オブジェクトを使用せずに)参照を格納するだけの場合は、コンストラクタを変更してオブジェクトへの参照を行うことができます。

この場合も、循環依存性は回避します。

0

)B自体の参照には、そのB_ように、その参照を設定することができshared_aのA_constructorでそう?

関連する問題