C++ 在构造函数内初始化对HINSTANCE的引用

C++ 在构造函数内初始化对HINSTANCE的引用,c++,visual-studio,winapi,hinstance,C++,Visual Studio,Winapi,Hinstance,我有一个类,我想把它作为一个全局对象,我有一个很好的理由,但是我需要初始化所有的元素,如果我没有得到C2512,没有默认的构造函数,这是一个问题,因为我使用了一个对它的引用,我也需要初始化它,我不知道我能做什么。代码如下: class Foo { private: //Class data HINSTANCE hInstance; public: Foo(HINSTANCE & hInstance = ??, std::string name = "Default

我有一个类,我想把它作为一个全局对象,我有一个很好的理由,但是我需要初始化所有的元素,如果我没有得到C2512,没有默认的构造函数,这是一个问题,因为我使用了一个对它的引用,我也需要初始化它,我不知道我能做什么。代码如下:

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");
}

知道我该怎么做吗?谢谢

如果构造函数不打算修改HINSTANCE,则没有理由通过引用传递HINSTANCE,只存储它。HINSTANCE已经是一个指针,所以只需按值传递它,并将其默认为NULL,例如:

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");

    //...
}

你有哪些特别的错误?我看不到任何东西阻止添加默认构造函数,该构造函数初始化为全局的安全驻车值,或指向指向main中自动变量的Foo的指针。两者都有相同的缺点:foo在使用时可能不会处于完全初始化状态。你最好还是观察一下莱伊。你有什么好的理由来进行全球合作?也许有人可以提供一个更安全的替代方案。我不能为全局函数添加默认构造函数,因为我想创建一个窗口,如果我这样做,来自Win32 api的GetMessage总是抛出错误,我不能创建指针,因为我也使用静态函数。我认为global是一个很好的选择,因为它可以从main中的其他函数访问,而不需要指向对象的指针。您似乎希望创建实例,并提供HINSTANCE,但在HINSTANCE可用之前。当然你可以看到这是不可能的。我觉得很明显,一旦你有了HINSTANCE,你就应该在WinMain中创建这个实例;