排序对象指针矢量

时间:2014-11-03 05:48:44

标签: c++ sorting pointers object vector

我正在创建一个种族的c ++程序。 我有比赛课。每个种族都有一个名称,距离和结果指针的向量(每个参与者的结果)。 结果类有一个指向参与者和时间的指针。 上课时间有小时,分钟和秒。 我想将结果向量从最快的时间排序到最慢的时间,因此为了比较结果,我在类bool operator <(Result& res2) const中创建了函数result

.h文件中的所有功能都已实现,我只是没有全部显示。

我几乎可以确定函数sortResults不对,但函数operator<给我的错误是我不知道如何解决。它在所有if语句中给出了这个错误:此行的多个标记

- passing 'const Time' as 'this' argument of 'unsigned int Time::getHours()' discards qualifiers [-
 fpermissive]
- Line breakpoint: race.cpp [line: 217]
- Invalid arguments ' Candidates are: unsigned int getHours() '

你能告诉我我做错了什么吗?

.h文件:

class Time
{
    unsigned int hours;
    unsigned int minutes;
    unsigned int seconds;
public:
    Time(unsigned int h, unsigned int m, unsigned int s, unsigned int ms);
    Time();
    unsigned int gethours();
    unsigned int getMinuts();
    unsigned int getSeconds();
    string show();
};

class Participant {
    string name;
    unsigned int age;
    string country;
public:
    Participant(string n, unsigned int a, string c);
    string getName();
    string getCountry();
    int getAge();
    string show() const;
};

class Result {
    Participant *part;
    Time time;
public:
    Result(Participant  *p, Time t);
    Participant *getParticipant() const;
    Time getTime();
    string show();
    bool operator <(Result& res2) const;
};

class Race {
    string name;
    float distance;
    vector<Result *> results;
public:
    Race(string nm, float dist);
    string getName();
    void setName(string nm);
    float getDistance();
    vector<Result *> sortResults();
    void addResult(Result *r);
    string showRaceResults();
    string show();
};

.cpp文件:

bool Result::operator <(Result& res2) const {
    if (time.gethours() < res2.getTime().gethours())
        return true;
    else {
        if (time.gethours() > res2.getTime().gethours())
            return false;
        else {
            if (time.getMinutes() < res2.getTime().getMinutes())
                return true;
            else {
                if (time.getMinutes() > res2.getTime().getMinutes())
                    return false;
                else {
                    if (time.getSeconds() < res2.getTime().getSeconds())
                        return true;
                    else {
                            return false;
                        }
                }
            }
        }
    }
}

vector<Result *> Race::sortResults() {
    sort (results.begin(), results.end(), operator <);
return results;
}

2 个答案:

答案 0 :(得分:3)

您应该将Time::gethours()声明并定义为常量成员函数。

class Time {
// ...
    unsigned int gethours() const;  // note the "const"
};

unsigned int Time::gethours() const { /* ... */ } // note the "const"

要对vector<Result*>进行排序,您需要

  1. 更改Result::operator<()const Result&而不是Result&作为参数
  2. 定义Result*的比较函数,其类似于static bool cmpResultPtr(const Result* lhs, const Result* rhs) { return *lhs < *rhs; }
  3. 致电sort(results.begin(), results.end(), cmpResultPtr);
  4. cmpResultPtr()的定义之前,可以在.cpp文件中定义函数Race::sortResults()

答案 1 :(得分:1)

你宣布运营商&lt;要成为const但它调用的Time :: getHours没有相同的声明。对于编译器,这意味着getHours可以更改违反运算符&lt;的常量成员的值。