【问题标题】:Comparison operator overloading for a struct, symmetrically comparing my struct with an int type?结构的比较运算符重载,对称地将我的结构与 int 类型进行比较?
【发布时间】:2013-04-18 21:28:29
【问题描述】:

我正在尝试重载这些运算符: <<===>=>,也许以后还有!=, 在一个结构中。

似乎将结构的一个对象与同一个结构的另一个对象进行比较很容易,因为在这种情况下重载运算符时,定义会自动对称。

但是如果我想将我的结构 FOODint 进行比较呢? 这也很容易,只要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&lt; 定义所有运算符。
  • P.S.由于结构的所有成员都是公共的,因此不需要使用friend 来做任何事情。
  • 由于int foodID 似乎可以唯一标识FOOD,您可以通过提供转换operator int() const; 来消除所有这些比较。

标签: c++ struct operator-overloading


【解决方案1】:

FOOD 结构之外定义它:

bool operator> (const int &i, const FOOD &f) {return i >  f.foodID;}

不要忘记从 FOOD 结构中删除这个错误的声明:

bool operator> (const int &, const FOOD &) const; // <--- remove it

以及对应的定义:

bool FOOD::operator> (const int &i, const FOOD &f) const {return i >  f.foodID;} // <--- remove it

对其他运算符重复相同的操作。

解决方案

你声称你理解“不止一个论点”。然而,事实证明你没有。我不明白为什么您很难理解编译器和这里的 2 个人告诉您的内容,但解决方案如下所示:

struct FOOD {
    int foodID;
    double price;

    bool operator> (const FOOD  &) const;
    bool operator>=(const FOOD  &) const;
    bool operator==(const FOOD  &) const;
    bool operator<=(const FOOD  &) const;
    bool operator< (const FOOD  &) const;

    bool operator> (const int   &) const;
    bool operator>=(const int   &) const;
    bool operator==(const int   &) const;
    bool operator<=(const int   &) const;
    bool operator< (const int   &) const;
};

bool FOOD::operator> (const FOOD  &f) const {return foodID >  f.foodID;}
bool FOOD::operator>=(const FOOD  &f) const {return foodID >= f.foodID;}
bool FOOD::operator==(const FOOD  &f) const {return foodID == f.foodID;}
bool FOOD::operator<=(const FOOD  &f) const {return foodID <= f.foodID;}
bool FOOD::operator< (const FOOD  &f) const {return foodID <  f.foodID;}

bool FOOD::operator> (const int   &i) const {return foodID >  i;}
bool FOOD::operator>=(const int   &i) const {return foodID >= i;}
bool FOOD::operator==(const int   &i) const {return foodID == i;}
bool FOOD::operator<=(const int   &i) const {return foodID <= i;}
bool FOOD::operator< (const int   &i) const {return foodID <  i;}

bool operator> (const int &i, const FOOD &f) {return i >  f.foodID;}
bool operator>=(const int &i, const FOOD &f) {return i >= f.foodID;}
bool operator==(const int &i, const FOOD &f) {return i == f.foodID;}
bool operator<=(const int &i, const FOOD &f) {return i <= f.foodID;}
bool operator< (const int &i, const FOOD &f) {return i <  f.foodID;}

【讨论】:

  • error: ‘bool FOOD::operator&gt;(const int&amp;, const FOOD&amp;) const’ must take exactly one argument。您了解错误信息吗?在类/结构中声明的运算符只能采用一个显式参数。在您的情况下,它需要 2,因此您会得到错误。要解决这个问题,请按照我的回答。
【解决方案2】:

这类运算符

bool operator> (const int &, const FOOD &) const; 

不能成为会员。成员函数需要一个额外的 FOOD* 类型的隐式参数(可能是 cv 限定的),因此上面的示例实际上需要三个参数。您需要将其设为非会员。

我认为最简单的方法是给你的班级一个明确的int 转换运算符

explicit operator int() const { return foodID; }

还请注意,所有比较运算符都可以用一个单独的运算符来表示,例如bool operator&lt;(这种技术例如在标准库关联容器中使用)

【讨论】:

  • 将简单地添加行显式 operator int() const { return foodID; } 如果我删除所有运算符重载,则进入结构声明工作?
猜你喜欢
  • 2021-11-07
  • 1970-01-01
  • 2019-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-08
  • 1970-01-01
相关资源
最近更新 更多