我遇到了我创建的两个类的问题。这是一个简单的体育赛季计划。我创建了一个名为Season的类,它创建了一个指向Game对象的指针向量。编译器抱怨游戏是一个未声明的标识符,即使我已经定义并测试了它的工作原理。
为什么游戏类不能在Season课程中使用,或者如何让它们被使用(也许将它嵌入季节的公共部分,不知道这是好还是坏)?
class Season
{
public:
Season();
void add_game(int number, string a, int a_score, string b, int b_score);
private:
vector<Game*> games;
int game_high_score;
string game_high_score_team;
int season_high_score;
string season_high_score_team;
string champion;
};
Season::Season()
{
int game_high_score = -2;
string game_high_score_team = "Unknown";
int season_high_score = -2;
string season_high_score_team = "Unknown";
string champion = "Unknown";
}
void Season::add_game(int number, string a, int a_score, string b, int b_score)
{
Game* temp_game = new Game(number, a, b, a_score, b_score);
games.push_back(temp_game);
}
string Season::toStr() const
{
stringstream out;
out << "Number of games in the season: " << games.size() << endl
<< "game_high_score_team: " << game_high_score_team
<< "\tScore: " << game_high_score_team << endl
<< "season_high_score: " << season_high_score
<< "\tScore: " << season_high_score << endl
<< "champion: " << champion << endl;
return out.str();
}
// Game class stores values and has functions for each game of the season
class Game
{
public:
Game();
Game(int number, string a, string b, int a_score, int b_score);
string winner(string a, string b, int a_score, int b_score);
string toStr() const;
string get_team_a() const;
string get_team_b() const;
int get_team_a_score() const;
int get_team_b_score() const;
string get_winner() const;
int get_top_score() const;
private:
int game;
string team_a;
string team_b;
int team_a_score;
int team_b_score;
string won;
int top_score;
};
Game::Game()
{
game = -1;
team_a = "";
team_b = "";
team_a_score = -1;
team_b_score = -1;
won = "";
top_score = -1;
}
Game::Game(int number, string a, string b, int a_score, int b_score)
{
game = number;
team_a = a;
team_b = b;
team_a_score = a_score;
team_b_score = b_score;
won = winner(team_a, team_b, team_a_score, team_b_score);
}
string Game::winner(string a, string b, int a_score, int b_score)
{
if (a_score > b_score)
{
top_score = a_score;
return a;
}
else if (a_score < b_score)
{
top_score = b_score;
return b;
}
else
{
top_score = a_score;
return "Tie";
}
}
string Game::toStr() const
{
stringstream out;
out << "Game #" << game << endl
<< "team_a: " << team_a << "\tScore: " << team_a_score << endl
<< "team_b: " << team_b << "\tScore: " << team_b_score << endl
<< "Won: " << won << "\t TopScore: " << top_score << endl;
return out.str();
}
int main(int argc, char* argv[])
{
string file_name;
Season sport;
file_name = "season.txt"
ifstream fin(file_name);
if (fin.fail())
{
cout << "Could not read file: " << file_name << endl;
}
if (fin.is_open())
{
string temp;
getline(fin, temp);
int game;
string a;
string b;
int a_score;
int b_score;
while (!fin.eof())
{
fin >> game >> a >> a_score >> b >> b_score;
sport.add_game(game, a, b, a_score, b_score);
}
// close the input stream from the file.
fin.close();
}
system("pause");
return 0;
}
答案 0 :(得分:3)
编译器从头开始逐行读取您的程序。在您首次引用Game
的时候:
vector<Game*> games
您尚未声明Game
。
您必须在Game
之前移动Season
声明,或者必须转发声明 Game
。
要转发声明Game
,请在Session
的定义之前添加此声明:
class Game;
答案 1 :(得分:1)
定义Season
时,仍然没有关于类Game
的未来定义的信息。您必须在Game
之前转发声明Season
:
class Game;
这将允许您在允许不完整类型的上下文中使用它。在Game
开始之前定义Season
可能更有意义。