c++ - 重载 == 运算符导致丢弃限定符错误

标签 c++ polymorphism operator-overloading

我正在使用 C++ 创建一个复数类。我想重载 == 运算符。 但是我得到了这个错误:

In file included from Complex.cpp:1:0,
             from testComplex.cpp:2:
Complex.h: In function ‘bool operator==(const Complex&, const Complex&)’:
Complex.h:29:21: error: passing ‘const Complex’ as ‘this’ argument of ‘double Complex::real()’ discards qualifiers [-fpermissive]
     return (c1.real() == c2.real() && c1.imag() == c2.imag());

这是我的类文件:

#ifndef COMPLEX_H
#define COMPLEX_H

class Complex{
    public:
    Complex(void);
    Complex(double a, double b);
    Complex(double a);
    double real(){ 
        return a;
    }

    double imag(){
        return b;
    }
    private:
    double a;
    double b;
};

bool operator==(const Complex& c1, const Complex& c2){
    return (c1.real() == c2.real() && c1.imag() == c2.imag());
}
#endif

如何解决?

最佳答案

编译器基本上是在说您似乎正在使用一个只读对象的函数,该函数允许更改它。想象一下,如果您可以在一个只读 复杂对象上调用一个成员函数 say IncrementImaginary();,您将改变一个>只读对象!

这就是为什么当您的成员函数不改变您类的变量(即状态)时,您应该附加一个const像这样对他们进行限定:

double real() const{
  return a;
}

这样,编译器就会知道在您的类的只读对象上运行此函数是安全的。

关于c++ - 重载 == 运算符导致丢弃限定符错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26435843/

相关文章:

c++ - 在循环中创建一个对象

C++ 对象构建函数返回基类类型

java - 获取反序列化器中的属性类型( jackson )

c++ - 重载 + 运算符取一条线(两个坐标*2) + 一个点(两个坐标)

c++ - 运算符重载 : Ostream/Istream

c# - 重载的 false 运算符什么时候被执行,它有什么用?

c++ - 一个流是如何与另一个流联系在一起的?

c++ - 为什么移动超过允许的位仍然有效?

c++ - 从 Xcode 链接到 Boost

c++ - 尽管在派生类中有定义,但基类中的方法不可见;多态性和使用 `virtual` 关键字