У меня есть класс, и я хочу сделать его глобальным объектом (у меня есть веская причина для этого), но для этого мне нужно инициализировать все элементы (если нет, я получаю 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");
}
Любая идея, как я могу это сделать? Спасибо!
Там нет причин, чтобы передать 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");
//...
}
Других решений пока нет …