2017-05-16 2 views
-2

클래스가 있는데 전역 객체로 만들려고합니다. (그 이유가 있습니다.)하지만 모든 요소를 ​​초기화해야합니다. C2512 기본 생성자가 없습니다.) 초기화에 필요한 HINSTANCE에 대한 참조를 사용하기 때문에 문제가되는데, 무엇을 할 수 있는지 모르겠습니다. 코드는 다음과 같습니다.생성자 내에서 HINSTANCE에 대한 참조 초기화

나는 어떻게 할 수 있습니까?, 감사합니다!

+0

특히 어떤 오류가 발생합니까? [MCVE]를 게시하십시오. –

+0

전역의 안전한 주차 값으로 초기화하는 기본 생성자 또는'main'의 자동 변수를 가리키는'Foo '의 포인터를 추가하는 것을 막는 것에는 아무 것도 없습니다. 두 가지 모두 같은 단점을 가지고 있습니다 :'foo'는 완전히 초기화 된 상태로 사용되지 않을 수 있습니다. RAII를 관찰하는 것이 더 낫습니다. 세계에 대한 당신의 이유는 무엇입니까? 어쩌면 누군가가 더 안전한 대안을 제시 할 수 있습니다. – user4581301

+0

윈도우를 만들고 싶을 때 Win32 API의 GetMessage에서 항상 오류가 발생하고 정적 함수로 작업하기 때문에 포인터를 만들 수 없기 때문에 창을 생성하기 때문에 전역에 대한 기본 생성자를 추가 할 수 없습니다. 나는 객체에 대한 포인터없이 main에서 다른 함수로부터 접근 할 수 있기 때문에 전역 변수가 좋은 선택이라고 생각한다. – 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로 값을 전달하고 그것을 기본, 이미 시작에 대한 포인터입니다