1

私はMSDNのチュートリアルに従っています:http://msdn.microsoft.com/en-us/library/windows/desktop/ff381400 (v = vs.85).aspx

これは、WINAPIでウィンドウを作成するためのクラスを作成する方法を示しています。

コンストラクターにCreationコードを配置したことを除いて、私はそれらとまったく同じことをしました。

実行すると、エラーと呼ばれる純粋仮想メソッドが提供され、説明なしでプログラムが終了します。

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

以上です。なぜそれが私にそのエラーを与えるのですか、そしてどうすればそれを修正できますか?

4

1 に答える 1

1

コンストラクターにCreationコードを配置したことを除いて、私はそれらとまったく同じことをしました。

これが理由です。コンストラクターからメソッドを呼び出すvirtualと、期待どおりの結果が得られません。ただし、階層内の現在のクラスからメソッドを呼び出すことを期待する場合を除きます。基本クラスのコンストラクターが実行されるとき、オブジェクトはまだ派生型ではありません。そして、そのクラスのコンストラクターから現在のクラスで純粋なメソッドを呼び出すと、virtualそのエラーが発生します。

于 2013-03-10T00:06:40.973 に答える