-2

我想在 main 中运行函数 Run,但由于没有默认构造函数,我不允许创建对象。当我尝试创建默认构造函数时,我收到消息,“错误”Game::Game int maxComponents)“没有提供以下初始化程序:”

//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 int成员 ( TICKS_1000MS)。因为它是const,所以它应该在构造函数中被初始化。所以你应该做这样的事情:

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 回答