3

C++ には 2 つのグローバル オブジェクトがあり、どちらも別のファイルで他のオブジェクトによって定義されています。1 つのオブジェクトの構築は、既に構築されている他のオブジェクトに依存します。

class independent; 
class  dependent;
independent o1;
dependent o2;

o1 が o2 の前に構築されるようにするには、o2 の前に o1 を宣言します。

これにより、 o1 が o2 の前に構築されることを保証できますか? コンパイラがオーダリングを変更した場合はどうなりますか?

ありがとう

4

7 に答える 7

8

シンプル:Aに依存しているB場合は、そのコンストラクターでパラメーターとしてA受け取る必要がBあります。

コードに嘘をつかないでください。

于 2013-09-12T04:17:10.770 に答える
6

2 つのグローバルがコンパイル単位内で順番に並んでいる場合、それらは順番に初期化されます。それらが異なるコンパイル単位で異なる順序にある​​場合 (異なる .cpp によって異なる順序に含まれる異なる .h ファイルにある場合など)、結果は未定義です。

それらを順番に配置する必要があるが、同じコンパイル単位で取得できない場合は、シングルトン パターンの使用を検討してください。

class Independent
{
    public:
        static Independent& getO1()
        {
            static Independent o1;
            return o1;
        }
};

class Dependent
{
    public:
        static Dependent& getO2()
        {
            Independent::getO1(); // force o1 to exist first
            static Dependent o2;
            return o2;
        }
};

これは、.h ファイルがどのようにインクルードされるかに関係なく、静的ローカル変数が最初に使用されるときに初期化されるという規則を使用して順序を保証します。

于 2013-09-12T02:24:30.240 に答える
0

それらが構築される順序についての保証はありません。

グローバルを使用しないようにするだけでなく、この依存関係を排除することが最善の選択です。ただし、必要に応じて、いずれかを確実に実行したい場合は、ポインターとポインターを返す関数を使用することをお勧めします。

independent * pindependent = null;
dependent * pdependent = null;

independent * getIndependent()
{
  if(pindependent == null)
    pindependent = new independent(); // fixed the bug pointed to by the Mooing Duck
  return pindependent;
}

dependent * getDependent()
{
  if(pdependent == null)
  {
    getIndependent();
    pdependent = new dependent(); // fixed the bug pointed to by the Mooing Duck
  }

  return pdependent;
}

ヘッダー ファイルでは、関数を公開できます (オプションで extern を使用)。

extern independent * getIndependent();
extern dependent * getDependent();
于 2013-09-12T02:35:57.670 に答える