Компилятор не может найти inversion
в operator/
, потому что inversion
является ComplexNumber
функцией-членом и ее необходимо вызывать для экземпляра ComplexNumber
.Кроме того, он является private
членом и не может быть доступен вне ComplexNumber
, кроме как ComplexNumber
s friend
s.
В качестве функции-члена 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));
}
Собранный пример
#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 }
{
}
};
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.re * com2.re - com1.im * com2.im,
com1.re * com2.im + com1.im * com2.re);
}
ComplexNumber operator/(const ComplexNumber& com1, const ComplexNumber& com2)
{
return com1 * inversion(com2); // operator * already makes a new ComplexNumber. No
// need to make another
}
int main()
{
ComplexNumber com1(3, 7);
ComplexNumber com2(4, 2);
ComplexNumber com3 = com1 / com2;
}