c ++ сортирует массив объектов классов в общем виде - PullRequest
0 голосов
/ 11 февраля 2012

Добрый вечер, эксперты

Я работаю над упражнением по программированию в общем виде.Я понял, как сортировать разные объекты с разными типами данных, но я борюсь, как сортировать классы

Вот мой код:

#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;
}

, когда я вызываю функцию selectionSort компиляторомдает мне следующие ошибки:

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 ]

2 голосов
/ 11 февраля 2012

Как указывает на ошибку, operator< для Employee не существует, но вы пытаетесь использовать ее в своей функции сортировки.
Вам необходимо выбрать критерии заказа (например, численно по идентификатору сотрудника) и соответственно ввести 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);
1 голос
/ 11 февраля 2012

Вам необходимо реализовать оператор <для вашего класса сотрудников.Не ожидайте, что компилятор знает, как сделать это для вас.Вы должны сказать ему, что вы хотите, чтобы этот оператор сделал для класса. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...