2016-03-28 6 views
-3

ベクトルをすべて格納するにはを使用します。 Recordクラスには、studentとその年齢が含まれます。コマンドを取得して特定のメソッドを呼び出すと仮定します。しかし、私はそれをコンパイルすると、 "tは宣言されていません"と言いました。しかし、私は既にテーブルtとして宣言しています。表示方法を変更せずにprivatevectorにアクセスするにはどうすればよいですか。C++で複数のクラスを持つベクトルで項目にアクセスして格納する方法

class student{ 
    public: 
    int id; 
    string name; 
    student(); 
    student(int,string); 
}; 

class Record{ 
    public: 
    student student; 
    int age; 
}; 

class table{ 
    public: 
    void Insert(student x,int y); 
    void Print(table t) 
    private: 
    vector <Record> records; 
}; 

void Insert(student x,int y){ 
    Record r; 
    r.student=x; 
    r.grade=y; 
    t.records.push_back(r); 
} 

void Print(table t){ 
    sort(t.record.begin() , t.record.end()); 
    vector<Record>::iterator itr; 
    for(itr = t.record.begin() ; itr != t.record.end() ; itr++) 
      cout << (*itr).student.id << '\t' << (*itr).student.name << '\t' << (*itr).age << endl; 
} 

int main(){ 
    student x; 
    table t; 
    string command,name; 
    int id,age; 
    while (cin >> command){ 
     if (command=="Insert"){ 
      cin >> id >> name>> grade; 
      student s(id,name); 
      t.InsertStudent(s,grade); 
     }else if (command == "Print"){ 
      t.Print(t); 
     }else{return 0; 
    } 
} 

エラーメッセージは次のとおりです。

tは、私はクラス名を大文字にしているし、問題がまだ存在するt.records.push_back(r);

にこのスコープで宣言されていませんでした。

+0

エラーメッセージは何ですか?どの行?プライベートメンバーにアクセスする場合は、そのメンバー用のゲッター関数を作成します。クラスの名前をそのクラスの変数インスタンスの名前(レコードクラスの生徒)として使用しないでください。クラス名には大文字小文字を使用することをお勧めします。 –

+1

あなたは良い本を見つけて、オブジェクト指向プログラミング入門資料を読むべきです。たとえば、 'class Table'(o_weismanの右辺はクラス名を大文字にする)は' void print(); 'を持ち、ファイルスコープで' void Table :: print(){...} 'を持ち、そこを参照する必要があります( '' t 'を除いて) ''レコード ''に変換します。 –

+0

エラーメッセージは「t.records」でこのスコープで宣言されていません。 – WILLIAM

答えて

1

このコードでは、かなりの数の問題があります。だから私はあなたの質問に最も密接に関連する3つの間違いに対処します:私は可視性を変えずにプライベートベクトルにアクセスできますか?

  1. あなたは:t.InsertStudent(s,grade)を呼び出しています。 table tを宣言すると、class tableInsertStudentメソッドが呼び出されます。それは1つではありません。おそらくInsertメソッドを呼び出すつもりでした。
  2. あなたはおそらくvoid table::Insert(student, int y)方法として意図されていた機能void Insert(student x,int y)を定義します。定義のクラススコープに注意してください。あるいは、宣言を削除して、クラススコープで定義を直接使用することもできます。
  3. tは、このファンクションにアクセスできるグローバルオブジェクトではないt.records.push_back(r)を呼び出しようとしています。 records.push_back(r)

私が試した:しかし、あなたはあなたが直接メンバ変数にアクセスできる代わりに、メンバ変数にアクセスするには、オブジェクト名を使用することはありません方法としてこれを定義することを意図しているから推測簡単に物事を修正する方法を説明しますが、いくつかの根本的な概念上の問題があります。対処する必要があります。フォローアップの質問をする前に、少なくともhttp://www.cplusplus.com/doc/tutorial/classes/まで読んでください。それを読んだ後に私の答えが不明瞭なまま残っている場合は、以下にコメントしてください。
コード内の他のエラーは、コンパイラが遅れて発行する行を調べることから始まります。あなたはそれを使用して解決することができない場合は、コードとエラーを投稿する新しい質問を開いて自由に感じる。

関連する問題