2013-03-10 80 views
1

我下面MSDN上的教程:http://msdn.microsoft.com/en-us/library/windows/desktop/ff381400(v=vs.85).aspx纯虚拟方法调用,终止

它展示了如何使一个类中WINAPI创建窗口。

我做了与他们完全相同的事情,除了我把创造代码放在构造函数中。

运行时,它会给出纯虚拟方法,称为错误,并终止没有解释的程序。

template<typename T> 
class Form 
{ 
    public: 
     Form(std::string Title, std::string Class, /*All other params*/); 

    private: 
     static LRESULT __stdcall WindowProcedure(HWND Hwnd, UINT Msg, WPARAM wParam, LPARAM lParam); 

    protected: 
     HWND WindowHandle = nullptr; 
     virtual LRESULT HandleMessages(UINT Msg, WPARAM wParam, LPARAM lParam) = 0; 
}; 



template<typename T> 
Form<T>::Form(std::string Title, std::string Class, /*All Other Params*/) 
{ 
    WNDCLASSEX WndClass = {/*Filled in with other params*/}; 

    RegisterClassEx(&WndClass); 
    WindowHandle = CreateWindowEx(/*Other params*/, this); 
} 

template<typename T> 
LRESULT __stdcall Form<T>::WindowProcedure(HWND Hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) 
{ 
    T* Data = nullptr; 

    switch (Msg) 
    { 
     case WM_NCCREATE: 
     { 
      CREATESTRUCT* pCreate = (CREATESTRUCT*)lParam; 
      Data = reinterpret_cast<T*>(pCreate->lpCreateParams); 
      SetWindowLongPtr(Hwnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(Data)); 
      break; 
     } 

     default: 
     { 
      Data = reinterpret_cast<T*>(GetWindowLongPtr(Hwnd, GWLP_USERDATA)); 
      return Data ? Data->HandleMessages(Msg, wParam, lParam) : DefWindowProc(Hwnd, Msg, wParam, lParam); 
     } 
    } 
    return 0; 
} 

那么我的主要窗口:

class MainWindow : public Form<MainWindow> 
{ 
    public: 
     MainWindow(std::string Title, /*Other params*/); 
     LRESULT HandleMessages(UINT Msg, WPARAM wParam, LPARAM lParam); 

     HWND WindowHandle() {return Form::WindowHandle;} 
}; 

MainWindow::MainWindow(std::string Title, std::string Class, /*Other params*/) {} 

LRESULT MainWindow::HandleMessages(UINT Msg, WPARAM wParam, LPARAM lParam) 
{ 
    switch(Msg) 
    { 
     case WM_CREATE: 
     { 
     } 
     break; 

     case WM_DESTROY: 
      PostQuitMessage(0); 
      break; 

     default: 
      return DefWindowProc(WindowHandle(), Msg, wParam, lParam); 
    } 

    return 0; 
} 

这是所有。为什么它会给我这个错误,我该如何解决?

回答

1

我做了与他们完全相同的事情,除了我把创造代码放在构造函数中。

这就是为什么。从构造函数调用virtual方法不会达到您所期望的效果 - 除非您期望它从层次结构中的当前类调用该方法。当基类构造函数执行时,该对象还不是派生类型。如果您从该类的构造函数中调用当前类中纯粹的virtual方法,则会出现该错误。