-2

関数 Run をメインで実行したいのですが、デフォルトのコンストラクターがないため、オブジェクトを作成できません。デフォルトのコンストラクターを作成しようとすると、「Error"Game::Game int maxComponents)" provides no initializer for:」というメッセージが表示されます。

//Game.h 
#pragma once
#include "GameComponent.h"
#include <time.h>
class Game
{
private:
    int componentCount;
    GameComponent** components;
    const int TICKS_1000MS;
public:

    Game(){}    //this does not work either
    Game(int maxComponents){}   //this does not work as my default constructor
    ~Game();
    void Add(GameComponent*);
    void Run();

};

//Game.cpp
#pragma once
#include "StdAfx.h"
#include "Game.h"
#include <iostream>
#include<time.h>
using namespace std;


void Game::Add(GameComponent*)
{
    components= new GameComponent*[componentCount];


}
void Game::Run()
{

    time_t rawtime;
    struct tm * timeinfo;

    time ( &rawtime );
    timeinfo = localtime ( &rawtime );      
    //cout << timeinfo->tm_hour<< ":" << timeinfo->tm_min << ":" << timeinfo->tm_sec << endl;

    for(int n=0;n<componentCount;n++)
    {
        components[n]->Update(timeinfo);

    }
}


Game::~Game()
{
}


//main.cpp
#include "stdafx.h"
#include <iostream>
#include "Game.h"
#include <time.h>

using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    Game obj1;
    obj1.Run();
    system("pause");
    return 0;
}

では、ここでデフォルトのコンストラクターを作成するにはどうすればよいですか? 私もメンバーの初期化を使用しようとしましたが、機能しません。コンストラクタをコピーします。

4

5 に答える 5

6

デフォルト コンストラクターは、引数を取らないコンストラクターです。したがって、次のようなコンストラクターを宣言する必要があります。

Game() { }

他のコンストラクターを保持できます-通常の関数のオーバーロードはコンストラクターに適用されるため、単一の整数引数を指定する場合は Game(int) コンストラクターを使用し、引数を指定しない場合は Game() を使用します。

ただし、あなたの場合、メンバー( )Gameが含まれています。であるため、コンストラクターで初期化されることが期待されます。したがって、次のようにする必要があります。const intTICKS_1000MSconst

Game() : TICKS_1000MS(123) { } // replace 123 with whatever the value should be

すべてのコンストラクターに対してこれを行う必要があります。

(コンストラクターに引数として渡される値とは対照的に) 常に同じ値に初期化されるクラスの非静的 const メンバーを持つのは少しばかげています。代わりに列挙型にすることを検討してください。

enum { TICKS_1000MS = 123 };

または、static constメンバー:

static const int TICKS_1000MS;

で初期化しますGame.cpp

const int Game::TICKS_1000MS = 123;
于 2012-11-22T20:32:58.257 に答える
2

デフォルト以外のコンストラクターを定義している限り、デフォルトのコンストラクターはもう提供されないため、手動で定義する必要があります。

public:
    Game() {}
    Game(int maxComponents){} 

これで、デフォルトのコンストラクターと、整数パラメーターを 1 つ取るオーバーロードされたコンストラクターができました。

于 2012-11-22T20:33:26.423 に答える
1

デフォルトのパラメーターなしのコンストラクターを作成する必要があります。コンストラクターを定義すると、バックグラウンドで作成されたデフォルトを取得できなくなります。

Game(){}
于 2012-11-22T20:33:58.103 に答える
0

あなたの場合、デフォルトのコンストラクターは、パラメーターを取らないコンストラクターですGame(){}

コンストラクタ パラメータを使用していないようですが、使用する場合はデフォルト値を指定する必要があります。

于 2012-11-22T20:33:31.290 に答える
0

おそらく、これらの行に沿って何かを行うことができます。クラス Game は、両方のコンストラクターで const int を初期化する必要があります。

class Game
{
private:
    int componentCount;
    GameComponent** components;
    const int TICKS_1000MS;
public:

    Game(): TICKS_1000MS(100)
    {}    //this does not work either
    Game(int maxComponents): TICKS_1000MS(100)
    {}   //this does not work as my default constructor
    ~Game();
    void Add(GameComponent*);
    void Run();

};

他の人が指摘したように、ctor または初期化子リストで const データを初期化する必要があります。

于 2012-11-22T20:50:40.887 に答える