我试图用复数来重写C ++中的*运算符。我还声明了一个常量I,它位于类文件(Complex.h)中。 Complex.cpp是该类的实现。主文件用于测试。但是,它无法编译。如何解决?
error: passing ‘const Complex’ as ‘this’ argument of ‘Complex Complex::operator*(const Complex&)’ discards qualifiers [-fpermissive]
cout << "Actual:" << (I * I) << endl;
这是我的主要文件:
#include <iostream>
#include "Complex.cpp" //remove it
#include "Complex.h"
using namespace std;
int main (){
// test multiplication
cout << "\nExpected:I*I = -1" << endl;
cout << "Actual:" << (I * I) << endl;
return 0;
}
这是我的Header文件:
#ifndef COMPLEX_H
#define COMPLEX_H
#include <cstdlib> //exit
#include <iostream>
class Complex{
public:
Complex(double a, double b);
Complex(double a);
double real() const{
return a;
}
double imag() const{
return b;
}
Complex operator*(const Complex& c2);
private:
double a;
double b;
};
//define a constant i
const Complex I(0,1);
#endif
这是实施文件:
#include "Complex.h"
#include <cmath>
using namespace std;
Complex::Complex(double realNum, double imagNum):a(realNum),b(imagNum){}
Complex::Complex(double realNum):a(realNum),b(0){}
Complex Complex::operator*(const Complex& c2){
double c = c2.real(), d = c2.imag();
return Complex((a*c-b*d),(b*c+a*d));
}
答案 0 :(得分:3)
您的陈述(I * I)
乘以两个const Complex
,因此您只能使用该类的const
方法。但是,您的operator*
仅在非const版本中可用。
要更正,只需通过
将其声明为const
即可
Complex operator*(const Complex& c2) const;
和实施中的相同。
编辑:更详细:您基本上有两种可能性来声明二元运算符,无论是在类之外还是
Complex operator*(Complex const& a, Complex const& b);
或在其中通过
Complex operator*(Complex const& a) const;
您选择了课堂版。因此,当编译器看到(I*I)
时,两者都是const
,它会将表达式转换为I.operator*(I)
。但是,为了做到这一点,operator*
必须是const
,否则无法从常量I
调用它。这是因为编译器必须假设该方法将改变I
,这是不允许的。