[英]Creating a vector of class pointers inside another class?
我遇到了我创建的两个类的问题。 这是一个简单的运动赛季计划。 我创建了一个称为Season的类,该类创建指向Game对象的指针的向量。 即使我已经定义并测试了类是否有效,编译器仍在抱怨Game是未声明的标识符。
Game类为什么不能在Season类中使用,或者如何才能使用它们(也许将其嵌套在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;
}
编译器从头开始逐行读取程序。 在您第一次参考Game
:
vector<Game*> games
您尚未声明Game
。
您必须在Season
之前移走Game
声明,或者必须向前声明 Game
。
要向前声明Game
,请在Session
定义之前添加以下声明:
class Game;
定义Season
,仍然没有有关Game
类的未来定义的信息。 您必须在Season
之前提前声明Game
:
class Game;
这将允许您在允许使用不完整类型的上下文中使用它。 首先,在Season
之前定义Game
可能更有意义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.