2012-02-11 94 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

您需要为您的员工类实施<运算符。不要指望编译器知道如何为你做这件事。你需要告诉它你希望那个操作员为这个班级做什么。

相关问题