この既存のコードには、クラスとそのクラスの初期化メソッドがあります。クラスのオブジェクトが作成されたら、そのオブジェクトでinitializeを呼び出す必要があります。
初期化メソッドが存在する理由 オブジェクトは、グローバルスコープを持つように早期に作成され、その後、依存するDLLを読み込んだ後に初期化メソッドが呼び出されます。
初期化 の問題クラスには現在、このbool isInitializedがあります。初期化されていない場合、処理を続行してエラーを返す前にすべてのメソッドでチェックする必要があります。簡単に言えば、それは大きな痛みです。
考えられる解決策の1つ は、コンストラクターで初期化することです。グローバルスコープ内のオブジェクトへのポインターのみがあります。dllがロードされた後、実際のオブジェクトを作成します。
上記のソリューションの問題 このクラスのオブジェクトを作成する人は誰でも、dllがロードされた後にのみ作成される必要があることを知る必要があります。さもないと、失敗します。
これは受け入れられますか?
call_once
してください。まだC ++ 11になっていないプロジェクトは、call_onceがC ++ 11でどのように実装されるか(どの問題を解決するか、どのように解決するか)を研究し、C ++の(古い)フレーバーで再実装する必要があります。状態を静的に(定数値で)初期化する必要があるマルチスレッド対応の同期プリミティブが必要です。C ++ 11より前のコンパイラには、満たす必要がある他の特異性がある可能性があることに注意してください。