4

C#では簡単ですが、C ++(ネイティブ、Win32、Visual C ++)では解決策がわかりません。したがって、重要なコンストラクターを持つクラスMyClass1があり、MyClass2にはタイプMyClass1の静的メンバーが必要です。

MyClass1.h:

class MyClass1 
{
   public MyClass1(type1 arg1, type2 arg2);
}

MyClass2.h:

class MyClass2
{
public:
   static MyClass1 Field1;
}

そしてMyClass2.cpp:

MyClass1 MyClass2::Field1(arg1, arg2);

このようなコードはMyClass2::Fieldを初期化し、この初期化中にMyClass1コンストラクターを呼び出すことを期待しています。ただし、コンパイラはClass1にのみメモリを割り当て、次のようにコンストラクタを呼び出すことはないようです。

MyClass1 MyClass2::Field1 = *(MyClass1 *)malloc(sizeof(MyClass1));

自明でないコンストラクターで静的クラスメンバーを初期化するC++の「公式」方法はありますか?

4

2 に答える 2

6

静的初期化順序Fiascoが発生している可能性があります。クラスまたは名前空間スコープの静的変数はmain()、実行前に初期化されますが、初期化の順序はリンク時の要因によって異なります。

この問題を解決するには、Construct on First Use Idiomを使用します。これは、関数が最初に呼び出されたときに関数スコープの統計が初期化されるという事実を利用しています。

于 2013-01-28T19:12:09.420 に答える