2011-10-23 4 views
0

私が作成した2つのクラスで問題が発生しています。シンプルなスポーツシーズンプログラムです。私は、ゲームオブジェクトへのポインタのベクトルを作成しているSeasonという1つのクラスを作成しました。コンパイラは、クラスが定義されテストされているにもかかわらず、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; 
} 
+0

プログラムのサイズをエラーだけに減らした場合は、非常に役立つでしょう。問題の一部ではなかったものをすべて削除することで、プログラムを約10行に減らすことができました。これにより、エラーを見つけやすくなり、潜在的には自分自身を見つけることがより簡単になりました。このデバッグ手法の詳細については、http://sscce.org/を参照してください。 –

答えて

3

コンパイラは、最初からプログラムを1行ずつ読み込みます。あなたの第一基準Game時点で:

vector<Game*> games 

あなたはまだGameを宣言していません。

あなたはSeason前に、あなたのGame宣言を移動させなければならないのいずれか、またはあなたがGameを前方に宣言する必要があります。

Gameを転送し、宣言前Sessionの定義にこの宣言を追加するには:

Seasonが定義されている
class Game; 
+0

私はクラスのプロトタイプを作らなければならないのか分かりませんでした。私に教えてくれてありがとう。 – LF4

1

、クラスGameの将来の定義に関する情報はまだありません。

class Game; 

これは、あなたが不完全なタイプが許可されているコンテキスト内で使用できるようになる:あなたはSeasonGameを宣言転送する必要があります。まず、Seasonの前にGameを定義する方がいいでしょう。

関連する問題