2012-02-11 93 views
0

晚上好,專家C++以普通方式對對象類進行排序

我正在用通用的方式進行編程練習。我明白瞭如何用不同的數據類型不同的對象進行排序,但我奮力如何排序類

這裏是我的代碼:

#include <iostream> 
#include<string> 
using namespace std; 

class Employee 
{ 
private: 
    int idNum; 
    string lastName; 
    int hireDate; 
    int verifyDate(int); 
public: 
    Employee(); 
    Employee(int,string,int); 
    void displayData(); 
    void setLastName(string); 
    void setIdNum(int); 
    void setHireDate(int); 
    void setGradePointAverage(double); 
}; 

Employee::Employee() 
{ 
    idNum=0; 
    lastName=""; 
    hireDate=0; 
} 

Employee::Employee(int idNum, string lastName, int hireDate) 
{ 
    this->idNum=idNum; 
    this->lastName=lastName; 
    this->hireDate=hireDate; 
} 

void Employee::displayData() 
{ 
    cout<<"\nEmployee Data:"; 
    cout<<"\nID: "<<idNum; 
    cout<<"\nLastName: "<<lastName; 
    cout<<"\nHireDate: "<<hireDate; 
} 

void Employee::setLastName(string lastName) 
{ 
    this->lastName=lastName; 
} 

void Employee::setIdNum(int idNum) 
{ 
    this->idNum=idNum; 
} 

void Employee::setHireDate(int hireDate) 
{ 
    this->hireDate=hireDate; 
} 

void Employee::setGradePointAverage(double grade) 
{ 
    double new_grade; 
    new_grade=grade; 
} 



template <class T> 
void selectionSort (T data[], int n){ 
    T temp; 
    for(int i=0, j, least; i < n-1; i++){ 
     for(j = i+1, least = i; j < n; j++){ 
      if (data[j] < data[least]){ 
       least = j; 
      } 
     } 
     temp = data[least]; 
     data[least] = data[i]; 
     data[i] = temp; 
    } 
} 


int main() 
{ 
    Employee e[3]; 

    e[0].setIdNum(337322); 
    e[1].setIdNum(3539854); 
    e[2].setIdNum(1224567); 

    e[0].setLastName("Marlen"); 
    e[1].setLastName("Oleg"); 
    e[2].setLastName("Test"); 

    e[0].setHireDate(25061989); 
    e[1].setHireDate(30001990); 
    e[2].setHireDate(12122012); 

    for (int i=0; i<3;i++) 
    { 
     e[i].displayData(); 
     cout<<"\n"; 
    } 

    selectionSort(e,3); 




    return 0; 
} 

當我把我的選擇排序函數編譯器給了我以下錯誤:

Error 1 error C2784: 'bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem *)' : could not deduce template argument for 'const std::basic_string<_Elem,_Traits,_Alloc> &' from 'Employee' c:\users\gulmira\documents\visual studio 2010\projects\csci203_lab1\csci203_lab1\task6.cpp 74 
Error 2 error C2784: 'bool std::operator <(const _Elem *,const std::basic_string<_Elem,_Traits,_Alloc> &)' : could not deduce template argument for 'const _Elem *' from 'Employee' c:\users\gulmira\documents\visual studio 2010\projects\csci203_lab1\csci203_lab1\task6.cpp 74 
Error 3 error C2784: 'bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const std::basic_string<_Elem,_Traits,_Alloc> &)' : could not deduce template argument for 'const std::basic_string<_Elem,_Traits,_Alloc> &' from 'Employee' c:\users\gulmira\documents\visual studio 2010\projects\csci203_lab1\csci203_lab1\task6.cpp 74 

請建議如何解決這一點的想法,在此先感謝

回答

2

正如錯誤所指出的,沒有operator<Employee,但您正嘗試在您的排序功能中使用它。
您需要選擇訂購標準(例如,通過員工ID進行數字化)並相應地執行operator<

如:

bool Employee::operator<(const Employee& rhs) const { 
    return idNum < rhs.idNum; 
} 

如果你想給調用者的排序標準的選擇,可以通過允許通過一個仿函數或函數指針將被用於比較不喜歡它std::sort()

template <class T, class Comp> 
void selectionSort (T data[], int n, Comp comp){ 
    // ... 
    if (comp(data[j], data[least])) { 
    // ... 

...然後你可以例如使用像這樣:

bool orderEmployeesByLastName(const Employee& a, const Employee& b) { 
    return std::lexicographical_compare(
       a.getLastName().begin(), a.getLastName.end(), 
       b.getLastName().begin(), b.getLastName.end()); 
} 

// ... 
selectionSort(e, 3, &orderEmployeesByLastName); 
+0

所以我明白我需要重載操作員? 和我如何訪問我排序數字和訪問它? – mydreamadsl 2012-02-11 17:04:52

+0

非常感謝你! – mydreamadsl 2012-02-11 17:09:22

+0

因此,如果我已經定義了運算符>按數字排序,如何按名稱排序? – mydreamadsl 2012-02-11 17:13:40

1

您需要爲您的員工類實施<運算符。不要指望編譯器知道如何爲你做這件事。你需要告訴它你希望那個操作員爲這個班級做什麼。

相關問題