我正在创建一个种族的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;
}
答案 0 :(得分:3)
您应该将Time::gethours()
声明并定义为常量成员函数。
class Time {
// ...
unsigned int gethours() const; // note the "const"
};
unsigned int Time::gethours() const { /* ... */ } // note the "const"
要对vector<Result*>
进行排序,您需要
Result::operator<()
以const Result&
而不是Result&
作为参数Result*
的比较函数,其类似于static bool cmpResultPtr(const Result* lhs, const Result* rhs) { return *lhs < *rhs; }
sort(results.begin(), results.end(), cmpResultPtr);
在cmpResultPtr()
的定义之前,可以在.cpp文件中定义函数Race::sortResults()
。
答案 1 :(得分:1)
你宣布运营商&lt;要成为const但它调用的Time :: getHours没有相同的声明。对于编译器,这意味着getHours可以更改违反运算符&lt;的常量成员的值。