2016-08-12 9 views
1

静的メンバオブジェクトの構造は、実行中に注入されるプロジェクト)は(主に非常に開始時に初期化されているAPIに依存しているようなので遅延プロジェクトは、DLLにコンパイルされる

int DLL_main() 
{ 
    TheApi::Initialize(); 
    AnObject anObjectInstance; 
    //.. 
} 

これと同様のクラス定義で構成されているオブジェクトがある:apiHelperObjectのコンストラクタにおいて

class AnObject() 
{ 
    AnObject(); 
    ~AnObject(); 

    static ApiHelper apiHelperObject; //This object assists in making certain api features easier to use 
} 

//Inside AnObject.cpp 

ApiHelper AnObject::apiHelperObject; 

は、いくつかありますstaticキーワードはapiHelperObjectから削除されたときにAPI関数は、DLLの注入の際に

を呼び出して、何も起こりません(エラーメッセージも同様)しかし、 はすべて

問題は静的メンバであることのようです正常に動作しません前にAPIを構築していると、複数の異なるAPIヘルパーオブジェクトがあるので、apiHelperObjectのコンストラクタでTheApi::Initialize()を呼び出すことはできません、そしてそれはTheApi::Initialize()が複数回呼び出される原因となる

を初期化され

それで質問は次のとおりです。

静的メンバオブジェクトが構築される前にAPIを初期化する最良の方法は何ですか?または、静的メンバーの作成を遅らせる最善の方法は何ですか?

構文は特に

もしあなたは常にアクセサ関数にそれが地元することによってstaticオブジェクトの初期化を遅らせることができ++、通常、標準のCでは

+0

_「この問題は、APIが初期化される前に静的メンバーが構築されているようです」_なぜそうではありませんか?これは静的な名前空間です。それは何かが起こる前に初期化されます。 「初期化」関数の使用をやめ、コンストラクターを適切に使用してください。 –

+0

タイプoの謝罪、それは編集された関数宣言ではありませんでした。 APIは私のものではなく、初期化関数を呼び出さなければなりません – linko13

答えて

5

ありがとうを好まれないよう好ましくは、ポインタが使用されていません。

は、基本的にそれはマイヤーズシングルトンです:ここで

auto helper_object() 
    -> ApiHelper& 
{ 
    static ApiHelper the_object; 
    return the_object; 
} 

、標準C++で、オブジェクトが初めての実行が宣言を通過する初期化されます。

しかし、C++標準ではダイナミックライブラリは積極的にサポートされていません。だから、これがどうやって出てくるのか言うのは難しい。スレッドの問題に注意してください。

関連する問題