【发布时间】:2013-04-18 21:28:29
【问题描述】:
我正在尝试重载这些运算符:
<、<=、==、>=、>,也许以后还有!=,
在一个结构中。
似乎将结构的一个对象与同一个结构的另一个对象进行比较很容易,因为在这种情况下重载运算符时,定义会自动对称。
但是如果我想将我的结构 FOOD 与 int 进行比较呢?
这也很容易,只要FOOD 先出现,然而,int 先出现的场景呢?如果没有 g++ 给我这么多“必须只包含一个参数”错误,我该如何定义?
我意识到
bool operator> (const int &, const FOOD &) const;
由于“不止一个论点”而出现问题。我明白了。
在我在互联网上搜索的所有论坛上,每个人的解决方案似乎都在使用friend,但他们的困难总是在类而不是结构的上下文中。 s struct是怎么做到的?
struct FOOD {
int foodID;
double price;
bool operator> (const FOOD &) const; //FOOD > FOOD
bool operator>=(const FOOD &) const; //FOOD >= FOOD
bool operator==(const FOOD &) const; //FOOD == FOOD
bool operator<=(const FOOD &) const; //FOOD <= FOOD
bool operator< (const FOOD &) const; //FOOD < FOOD
bool operator> (const int &) const; //FOOD > int
bool operator>=(const int &) const; //FOOD >= int
bool operator==(const int &) const; //FOOD == int
bool operator<=(const int &) const; //FOOD <= int
bool operator< (const int &) const; //FOOD < int
bool operator> (const int &, const FOOD &) const; // int > FOOD
bool operator>=(const int &, const FOOD &) const; // int >= FOOD
bool operator==(const int &, const FOOD &) const; // int == FOOD
bool operator<=(const int &, const FOOD &) const; // int <= FOOD
bool operator< (const int &, const FOOD &) const; // int < FOOD
};
bool FOOD::operator> (const FOOD &f) const {return foodID > f.foodID;}//FOOD > FOOD
bool FOOD::operator>=(const FOOD &f) const {return foodID >= f.foodID;}//FOOD >= FOOD
bool FOOD::operator==(const FOOD &f) const {return foodID == f.foodID;}//FOOD == FOOD
bool FOOD::operator<=(const FOOD &f) const {return foodID <= f.foodID;}//FOOD <= FOOD
bool FOOD::operator< (const FOOD &f) const {return foodID < f.foodID;}//FOOD < FOOD
bool FOOD::operator> (const int &i) const {return foodID > i;} //FOOD > int
bool FOOD::operator>=(const int &i) const {return foodID >= i;} //FOOD >= int
bool FOOD::operator==(const int &i) const {return foodID == i;} //FOOD == int
bool FOOD::operator<=(const int &i) const {return foodID <= i;} //FOOD <= int
bool FOOD::operator< (const int &i) const {return foodID < i;} //FOOD < int
bool FOOD::operator> (const int &i, const FOOD &f) const {return i > f.foodID;}// int > FOOD
bool FOOD::operator>=(const int &i, const FOOD &f) const {return i >= f.foodID;}// int >= FOOD
bool FOOD::operator==(const int &i, const FOOD &f) const {return i == f.foodID;}// int == FOOD
bool FOOD::operator<=(const int &i, const FOOD &f) const {return i <= f.foodID;}// int <= FOOD
bool FOOD::operator< (const int &i, const FOOD &f) const {return i < f.foodID;}// int < FOOD
g++ 给了我这些错误:
structsTransAndFood.cc:64:45: error: ‘bool FOOD::operator>(const int&, const FOOD&) const’ must take exactly one argument
【问题讨论】:
-
除了成员的默认保护之外,结构和类之间没有区别。如果需要,您可以根据
operator<定义所有运算符。 -
P.S.由于结构的所有成员都是公共的,因此不需要使用
friend来做任何事情。 -
由于
int foodID似乎可以唯一标识FOOD,您可以通过提供转换operator int() const;来消除所有这些比较。
标签: c++ struct operator-overloading