0

構造体AとBが次のように定義されたシングルトン構造体であるとします。

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をマージすることもできますが、そうすることは避けたいと思います。よりエレガントな解決策はありますか?

ありがとう、

サム

4

2 に答える 2

1

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

デザインが理にかなっているとまだ確信している場合、およびコンストラクターが(オブジェクトを使用せずに)参照のみを格納する場合は、コンストラクターを変更してオブジェクトへの参照を取得できます。

繰り返しますが、循環依存を避けます。

于 2012-05-07T02:55:15.020 に答える
0

shared_a()にB自体の参照を与えて、shared_aのA_constructorで、その参照をそのb_に設定できるようにするのはどうですか?

于 2012-05-07T02:15:09.797 に答える