我想在一个类中重载operator /。为此,我想定义一个私有反演方法,该方法计算第一个复数(1 / Z1)的反演,然后乘以第二个复数。 我开发了错误的代码
Exc20.cc: In function ‘ComplexNumber operator/(const ComplexNumber&, const ComplexNumber&)’:
Exc20.cc:75:31: error: ‘inversion’ was not declared in this scope
return ComplexNumber(com1 * inversion(com2));
代码的主体是
#include <iostream>
#include <cmath>
using namespace std;
class ComplexNumber
{
public:
double re;
double im;
ComplexNumber(double real = 0, double imag = 0): re{real}, im{imag} {};
private:
ComplexNumber& inversion(const ComplexNumber& com);
};
ComplexNumber& ComplexNumber::inversion(const ComplexNumber& com)
{
re = com.re/sqrt(com.re*com.re + com.im*com.im);
im = -com.im/sqrt(com.re*com.re + com.im*com.im);
return *this;
}
ComplexNumber operator*(const ComplexNumber& com1,const ComplexNumber& com2)
{
return ComplexNumber(com1.re*com2.re-com1.im*com2.im,com1.re*com2.im+com1.im*com2.re);
}
ComplexNumber operator/(const ComplexNumber& com1, const ComplexNumber& com2)
{
return ComplexNumber(com1 * inversion(com2));
}
int main()
{
ComplexNumber com1(3,7);
ComplexNumber com2(4,2);
com2.print();
com3=com1/com2;
com3.print();
}
答案 0 :(得分:0)
您的operator/
函数是一个类成员,这意味着必须在类对象上调用它。在代码中拥有它的方式就是像调用它是自由函数或静态类一样对其进行调用。
您可以将其设置为静态类。或者您可以更改它,以便可以在friend ComplexNumber operator/(const ComplexNumber& com1, const ComplexNumber& com2)
将其设为私有意味着{{1}}无法对其进行调用。但是,如果将运算符放在类中并使其成为朋友,那将是可行的。像这样:
{{1}}
答案 1 :(得分:0)
编译器无法在inversion
中找到operator/
,因为inversion
是ComplexNumber
成员函数,需要在ComplexNumber
的实例上调用。另外,它是private
成员,除ComplexNumber
的{{1}}之外,不能在ComplexNumber
之外访问。
作为成员函数,friend
在inversion
实例上进行操作,将其更改为ComplexNumber
参数的倒数。此方法的大多数用法将要求用户创建一个临时com
来存储反转。相反,我们可以使ComplexNumber
为自由函数,该函数返回一个新的inversion
。
ComplexNumber
这解决了
的所有问题ComplexNumber inversion(const ComplexNumber& com)
{
ComplexNumber temp;
temp.re = com.re / sqrt(com.re * com.re + com.im * com.im);
temp.im = -com.im / sqrt(com.re * com.re + com.im * com.im);
return temp;
}
组装示例
ComplexNumber operator/(const ComplexNumber& com1, const ComplexNumber& com2)
{
return ComplexNumber(com1 * inversion(com2));
}