在构造函数中初始化对HINSTANCE的引用

时间:2017-05-16 07:16:44

标签: c++ visual-studio winapi hinstance

我是一个类,我想把它作为一个全局对象(我有充分的理由),但为此我需要初始化所有元素(如果不是我得到C2512没有默认构造函数)这是一个问题,因为我在其上使用了对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");
}

我怎么能这样做呢?谢谢!

1 个答案:

答案 0 :(得分:0)

如果构造函数不打算修改它,则没有理由通过引用传递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");

    //...
}