如何在 if 语句中使用重载运算符作为条件?

Posted

技术标签:

【中文标题】如何在 if 语句中使用重载运算符作为条件?【英文标题】:How to use overload operator as condition in a if statment? 【发布时间】:2020-08-02 22:59:37 【问题描述】:

这是课程

#include <fstream>
#include <cstdlib>
#include <math.h>
#include <iomanip>
#include <iostream>
using namespace std;

class Point 
  protected:
    int x, y;
    double operator-(const Point &def) 
        return sqrt(pow((x-def.x),2.0)+ 
                  pow((y-def.y),2.0));
    

;

class Circle: public Point 
  private:
    int radius;

  public:
  Circle()     
    this->x=x;
    this->y=y;
    this->radius=radius;
  

  Circle(int x, int y, int radius)
this->x=x;
this->y=y;
this->radius=radius;

    void printCircleInfo() 
      cout << x << " " << y << " " << radius << " " ;
    

这是我想成为 if 语句中的条件的运算符。

bool operator==(const Circle &def) 
  return (x==def.x) & (y==def.y) & (radius==def.radius);

    bool doIBumpIntoAnotherCircle(Circle anotherCircle)
      if (anotherCircle.radius + radius >=   *this - anotherCircle    )
    return true;
      return false;
    

;

这里是主要的

int main()
  int x,y,radius;
  const int SIZE = 13;
  Circle myCircleArry[SIZE];
  myCircleArry[0] = Circle(5,3,9);
   cout << endl;
   myCircleArry[0].printCircleInfo(); cout << " ; ";
  ifstream Lab6DataFileHandle;

  Lab6DataFileHandle.open("Lab6Data.txt");
  while (!Lab6DataFileHandle.eof( )) 
 for (int i = 1; i < SIZE; i++) 
Lab6DataFileHandle>>x;
Lab6DataFileHandle>>y;
Lab6DataFileHandle>>radius;
 myCircleArry[i] = Circle(x,y,radius);

 if (myCircleArry[0].doIBumpIntoAnotherCircle(myCircleArry[i])) 
      myCircleArry[i].printCircleInfo(); cout << " ; ";

这是 If 语句

      if ( operator==( Circle &def))
 cout <<"*";



  
  

  Lab6DataFileHandle.close();


如何使用重载的运算符作为 if 语句的条件?如果您需要任何澄清,请以其他方式询问,请在您的回答中留下一个示例。 感谢您的宝贵时间。

【问题讨论】:

if (operator==(Circle &amp;def)) 无效。它需要是if (some_circle.operator== (some_other_circle)) 或(隐式调用operator==() 函数)if (some_circle == some_other_circle)。此外,由于您的 operator==() 是一个成员函数,因此该函数应限定为 const 以反映 a == b 通常不会更改 ab 的事实。 您的代码在应该使用函数时声明函数并没有帮助。声明和调用函数是不同的操作,使用不同的语法执行,并且您在希望调用它的地方声明它。更好地阅读您的介绍性 C++ 文本 - 猜测如何做事,显然是行不通的。 当我希望调用一个函数时,我应该在程序的哪个位置声明它? 源文件中包含调用之前(即上面)调用点的任何位置。对于类的成员函数,这意味着类定义也必须在调用它的点之前(因为在没有类定义可见性的情况下无法调用成员函数)。声明也可以在头文件中,只要该头文件在尝试使用声明的代码之前是#included/ 【参考方案1】:

A == 需要两个参数(即使重载是成员),您可以将 if 编写为任何其他 if 语句:

if(circle1 == circle2)  ... 

如果存在匹配的重载,编译器会将其转换为:

if(circle1.operator ==(circle2))  ... 

【讨论】:

好的,但是有没有办法让重载操作符返回true时if语句为true,返回false时if语句为false? 这就是相等运算符应该做的。一看就觉得你用错了。

以上是关于如何在 if 语句中使用重载运算符作为条件?的主要内容,如果未能解决你的问题,请参考以下文章

高级异常运算符重载

为啥不能重载三元运算符?

boost::asio::async_read_until 与自定义匹配条件运算符重载混淆

基础结构体重载,用 char*作为std::map中的key

类型匹配没有可行的重载运算符

C++运算符重载中 重载为类的成员函数和重载为类的友元函数 的区别是啥?