c++ - 结构的比较运算符重载,对称地将我的结构与 int 类型进行比较?

标签 c++ struct operator-overloading

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

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

但是如果我想比较我的结构 FOOD 怎么办?到int ? 这也很容易只要FOOD先来的,但是,int先来的场景呢?如果没有 g++ 给我那么多“必须包含一个参数”错误,我该如何定义它?

我意识到

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

由于“不止一个参数”的问题而出现问题。我明白了。

在我搜索过的所有论坛上,每个人的解决方案似乎都在使用 friend ,但他们的困难总是在类的上下文中,而不是结构中。这是如何为 s 结构完成的?

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

最佳答案

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;}

关于c++ - 结构的比较运算符重载,对称地将我的结构与 int 类型进行比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16093413/

相关文章:

c# - 为什么 C# 编译器不调用隐式转换运算符?

c++ - Win32 - Midi 循环与 MCISendString

c - 具有特定要求的纯C通用双向哈希表

c - 读取位域元素时在 C 中给出不同的值

c - 轻松访问多个结构数组

python peewee 文档 : example app: unknown syntax/feature

c++ - move 语义和运算符重载

C++ 为什么 empty set::emplace() 将一个元素插入到一组指针中?

c++ - Visual C++ CLR 设计器在第二次运行项目和编辑设计时总是显示 0x8000000A 错误

c++ - 我如何允许移动构造并禁止类的赋值和复制构造