2017-05-16 42 views
-2

私はクラスを持っていて、それをグローバルオブジェクトとして作っていますが(私にはそれが良い理由があります)、すべての要素を初期化する必要がありますC2512デフォルトのコンストラクタはありません)。これは、私が初期化する必要があるHINSTANCEへの参照を使用しているため、何ができるのか分かりません。コードは次のとおりです。コンストラクタ内のHINSTANCEへの参照を初期化する

class Foo { 
private: 
    //Class data 
    HINSTANCE hInstance; 
public: 
    Foo(HINSTANCE & hInstance = ??, std::string name = "Default"); 
}; 

Foo foo; 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { 
    foo = Foo(hInstance, "SomeName"); 
} 

どのようにすればいいのでしょうか?、ありがとう!

+0

特にどんなエラーが出ていますか?投稿[MCVE]してください。 –

+0

グローバルの安全な駐車値に初期化するデフォルトのコンストラクタや、 'main'の自動変数を指す' Foo'へのポインタの追加を妨げるものは何もありません。どちらも同じ欠点があります: 'foo'は使用時に完全に初期化された状態ではないかもしれません。おそらくRAIIを観察する方が良いでしょう。あなたはグローバルな理由は何ですか?誰かがより安全な選択肢を提供するかもしれない。 – user4581301

+0

私はウィンドウを作成したいので、グローバルなデフォルトのコンストラクタを追加できません。また、Win32 APIからのGetMessageは常にエラーをスローし、静的関数を扱うのでポインタを作成できません。私は、オブジェクトへのポインタなしでメインの他の関数からアクセスできるので、グローバルは良い選択だと信じています。 – OnelioD

答えて

0

HINSTANCEをコンストラクタが変更しないで保存する場合は、参照渡しする理由はありません。

class Foo 
{ 
private: 
    //Class data 
    HINSTANCE hInstance; 
public: 
    Foo(HINSTANCE hInstance = NULL, const std::string &name = "Default"); 
}; 

Foo::Foo(HINSTANCE hInstance, const std::string &name) 
    : hInstance(hInstance) 
{ 
    //... 
} 

は、その後、あなたがこれを行うことができます:また

Foo foo; 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
{ 
    foo = Foo(hInstance, "SomeName"); 
    //... 
} 

#include <memory> 

std::unique_ptr<Foo> foo; // or std::auto_ptr before C++11 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
{ 
    foo.reset(new Foo(hInstance, "SomeName")); 

    // or, in C++14 and later... 
    // foo = std::make_unique<Foo>(hInstance, "SomeName"); 

    //... 
} 
HINSTANCEは例えば、これだけNULLに値で渡して、それをデフォルト、すでにそもそもポインタであります
関連する問題