我试图超载operator <
以根据价格对房间进行分类。
以下是我的代码的相关部分:
class Room{
protected:
int roomNo;
int category;
Client client;
public:
Room();
Room(int no, int cat, Client cl);
void printData();
int charge();
Room operator < (Room &r1);
};
Room Room::operator < (Room &r1){
if(this->charge() < r1.charge()){
return r1;
}
else{
return *this;
}
}
但是当我尝试使用operator<
时,编译器会给我以下错误:
main.cpp:(.text+0x2d8): undefined reference to `Room::operator<(Room const&)'
main.cpp:(.text+0x2ff): undefined reference to `Room::operator<(Room const&)'
[Error] ld returned 1 exit status
Makefile.win recipe for target 'Ask01.exe' failed
为什么代码不能编译?
答案 0 :(得分:4)
您的班级Room
有一个签名为Room operator<(Room& r1)
的成员功能。但是,这不是用作重载operator<
的签名。将您的定义更改为
Room operator<(const Room& r1);
你的声明
Room Room::operator<(const Room& r1)
{
/* code */
}
此外,将运算符重载为朋友非成员函数被认为是更好的做法(参见this question)。
另外,我会考虑将operator<
的返回值更改为const Room&
,以避免不必要的副本。
无论如何,为什么operator<
的返回值不是bool
?这可能会使某人感到困惑。
Room first, second;
if (first < second)
doSomething(first);
else
doSomething(second);
可能比简单(first < second).doSomething()
长一点,但你的直觉肯定更清晰。
此外,如果您坚持将operator<
定义为成员函数,我建议将其声明为const
(如bool /*Room*/ operator<(const Room& r1) const;
。您还必须声明为const {{1甚至可能int charge()
)。请详细了解const correctness。