0

我遇到了“没有适当的默认构造函数可用”错误的问题,这可能只是我遗漏的一件小事。我对 C++ 很陌生,但我正在慢慢掌握它。

据我了解,如果您不指定任何构造函数,C++ 将创建一个默认构造函数。但是,即使我没有指定任何构造函数,我也会收到错误消息。我试过用谷歌搜索解决方案,但其他人要么扩展了错误的类,要么指定了构造函数,因此他们得到了这个错误。我没有指定任何构造函数,但我还是得到了这个错误。DirectXGame 类如下。

DirectXGame.h

#include "StdAfx.h"
#include "DirectInputHelper.h"

class DirectXGame
{
public:
    //DirectXGame();

    bool Initialize(HINSTANCE hInstance, HWND windowHandle);
    void ShutDown();

    bool LoadContent();
    void UnloadContent();

    void Update(float timeDelta);
    void Render();

private:
    HINSTANCE progInstance;
    HWND winHandle;

    D3D_DRIVER_TYPE driverType;
    D3D_FEATURE_LEVEL featureLevel;

    ID3D11Device* pDev;
    ID3D11DeviceContext* pDevContext;
    ID3D11RenderTargetView* pBackBufferTarget;
    IDXGISwapChain* pSwapChain;

    DirectXInput::DirectInputHelper inputHelper;
    DirectXInput::KeyboardState* keyboardDevice;
    DirectXInput::MouseState* mouseDevice;

    bool isShutDown;
};

请注意,我没有指定任何构造函数,因为它们已被注释掉。实际错误是在我创建类的新实例的主要方法中抛出的。

DirectXApp.cpp

int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow )
{

    UNREFERENCED_PARAMETER( hPrevInstance );
    UNREFERENCED_PARAMETER( lpCmdLine );

    if( FAILED( InitWindow( hInstance, nCmdShow ) ) )
        return 0;

    //std::auto_ptr<DirectXGame> DirectXGame( new DirectXGame() );
    DirectXGame* game = new DirectXGame(); //The compile error is on this line.


    bool result = game->Initialize(g_hInst, g_hWnd);

    if(!result)
    {
        game->ShutDown();


return -1;
}

// Main message loop
MSG msg = {0};
while(TRUE)
{
    if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);

        if(msg.message == WM_QUIT)
            break;
    }
    else
    {
        game->Update(0.0f);
        game->Render();
    }
}

game->ShutDown();

//Don't forget to delete the game object, as it is a pointer.
delete game;

return static_cast<int>(msg.wParam);

}

我可能只是遗漏了您在 C++ 中必须注意的许多小细节之一。

4

1 回答 1

2

您缺少空白/默认构造函数,编译器无法猜测如何自动为您实现一个。

如果 C++ 是一个普通(非复杂)类,C++ 将为您创建一个空白构造函数。如果你的类是另一个类的后代,那么它的祖先必须实现默认构造函数或者本身就是微不足道的。

如果您的类包含其他类,则包含的类必须为它们定义默认构造函数,或者它们本身必须是平凡的,以便编译器也可以为它们实现平凡的构造函数。

在您的情况下,罪魁祸首可能是DirectXInput::DirectInputHelper inputHelper;因为您的类没有任何祖先,并且您的所有数据成员都是指针、基本数据类型或定义的数据类型,而不是一个类数据变量。

于 2012-05-12T16:10:11.203 回答