2012-05-12 18 views
0

"利用可能なデフォルトコンストラクタがありません"というエラーが表示されていますが、これはおそらく1つしかないものです。私はC++には新しくなっていますが、徐々にそれを手に入れています。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++でに注意を払わなければならない多くの細部の一つが欠けています。

+0

あなたはC++を初めて使っていますが、DirectXゲームを作成しようとしていますか?スタックにオブジェクトを使用することに問題はありますか? – chris

+1

DirectXInput :: DirectInputHelper inputHelperをポインタにする必要がありますか? – Darcara

+0

あなたはエラーメッセージ全体を読んでいませんでしたか? –

答えて

1

空白/デフォルトのコンストラクタが不足しています。コンパイラは自動的にそのコンプレッサを実装する方法を推測できません。

単純な(複雑ではない)クラスの場合、C++は空のコンストラクタを作成します。あなたのクラスが別のクラスの子孫クラスである場合、その祖先はデフォルトのコンストラクタを実装するか、それ自体は自明でなければなりません。

クラスに他のクラスが含まれている場合、含まれるクラスにはデフォルトのコンストラクタが定義されているか、コンパイラが簡単なコンストラクタを実装できるように自明でなければなりません。

クラスに祖先がなく、すべてのデータメンバーがポインタ、基本データ型、または1つのクラスデータ変数以外の定義済みデータ型の場合、原因はおそらくDirectXInput::DirectInputHelper inputHelper;です。

+0

私はinputHelperをポインタに変更し、それが問題を解決しました。だから私は別の質問があります。私のクラスにプリミティブ、ポインタ、構造体以外のものが含まれている場合、デフォルトのコンストラクタは生成されません。 –

+0

@ NkosiDean:いいえ、正しくありません。コンパイラによって生成されたオブジェクトのデフォルトのコンストラクタは、各サブオブジェクトのデフォルトコンストラクタを再帰的に呼び出します(またはPODオブジェクトの場合、基本的にそれらを割り当てるだけです)。したがって、サブオブジェクトのいずれかにデフォルトコンストラクタがなく、PODオブジェクトでない場合、デフォルトのコンストラクタは生成されません(および生成できません)。また、クラスにconstオブジェクトまたは参照がある場合、それらの両方をある値で初期化する必要があるため、デフォルトのコンストラクタは生成されません。 –

+0

さて、私は理解していると思います。それをクリアしていただきありがとうございます。 :) –

関連する問題