2017-04-07 14 views
-1

以下のコードを使用して、Student配列を取り、gpaコンポーネントに基づいて並べ替えるために、並べ替え機能を使用したいと思います。私はStudent配列のパラメータと配列のサイズを使用する必要があります。私のint main関数の底に向かって見ると、配列ソートのためにメンバーソートを呼び出そうとしていますが、無駄はありません。a私が得るエラーは:クラス配列でメンバー関数を使用しようとしています

メンバー参照ベースタイプStudent [200]は構造体または共用体ではありません。

はどのように配列aを取ると、それは私が使用する必要があるパラメータを指定した上でメンバーSortを使用するように言って私のコードを書いてください。前もって感謝します。これがあまりにも大きければ、さらに詳しく指定しようとします。

class Student 
{ 
    private: 
     string ID, fname, lname, level; 
     double gpa; 
    public: 
     Student(); 
     Student(string id, string first, string last, double Gpa, string grade); 

     string getID() const; 
     string getfirst() const; 
     string getlast() const; 
     string getlevel() const; 
     double getGPA() const; 

     void setID(string id); 
     void setfirst(string f1); 
     void setlast(string l1); 
     void setlevel(string lev); 
     void setGPA(double GPA1); 

     friend void Sort(Student studentlist[], int size); 
     friend ostream& operator <<(ostream& ost, Student S1); 
}; 

int main() 
{ 
    ifstream ins; 
    ofstream outs; 
    ins.open("input.dat"); 
    outs.open("output.dat"); 

    if(ins.fail()) 
    { 
     cout << "File not found."; 
     exit(1); 
    } 

    if(outs.fail()) 
    { 
     cout << "Output file not opened."; 
     exit(1); 
    } 


    Student a[200]; 
    int x = 0; 

    while(!ins.eof()) 
    { 
     string id, fnam, lnam, levl; 
     double point; 
     ins >> id >> fnam >> lnam >> point >> levl; 

     a[x].setID(id); 
     a[x].setfirst(fnam); 
     a[x].setlast(lnam); 
     a[x].setGPA(point); 
     a[x].setlevel(levl); 


     if(a[x].getID() == "") 
     { 
      break; 
     } 

     x += 1; 
    } 

    if(x == 0) 
    { 
     cout << "File is empty" << endl; 
     return 0; 
    } 

    x = x +1; 
    a.Sort(a, x); 

    int t=0; 
    while(t<x) 
    { 
     outs << a[t]; 
     t += 1; 
    } 


    outs.close(); 
    ins.close(); 
    return 0; 
} 
+0

フレンド関数はメンバーではありません。 – aschepler

+0

に関して:while(!ins.eof()) '、[なぜループ状態の中のiostream :: eofが間違っていると思われますか?](http://stackoverflow.com/questions/5605125/why-is-iostreameof-ループ内のループ条件が間違っている) – user4581301

+0

残念ながらトピック: 'exit(1);'は 'main'では不要です。' return 1; ' – user4581301

答えて

0

a.を取り除きます。 Sortがフリー機能であるので、C#でありのような、しかし、あなたはstd::sortを使用することができ、あなただけの

C++で
Sort(a, x); 
0

、配列はクラスオブジェクトではない必要があるので、何Sort方法はありません。

using namespace std; 

Student array[200]; 
// (populate `array` here) 

sort(
    begin(array), 
    end(array), 
    [](const Student& x, const Student& y) -> bool { 
     return x.gpa > y.gpa; 
    } 
); 

私が代わりに大きなランタイムの安全のため、「生の」配列のstd::Array<T>を使用して個別に配列の長さを追跡するために必要避けることをお勧めします:

私はあなたがを保存していることに注意してくださいオブジェクトはポインタではなく値として扱われるので、オブジェクト全体をコピーするので、Studentを配列の別のインデックスに「移動」することはコストがかかるでしょう。 Studentsを個別に割り当て、代わりにポインタStudent*の配列をソートすることを検討してください。

a.Sort(a, x); 

0

使用したアカウントのカップルに間違っています。

  1. a具体タイプStudent [200]の、アレイ型です。配列にはメンバ関数はありません。したがって、a.の使用は許可されていません。

  2. Sortは非メンバ関数です。したがって、それは.Sort()構文で呼び出すことはできません。

ちょうど使用:

Sort(a, x); 
関連する問題