在类的公共方法中调用私有方法

时间:2018-12-02 06:30:33

标签: c++ class operator-overloading division

我想在一个类中重载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();
}

2 个答案:

答案 0 :(得分:0)

您的operator/函数是一个类成员,这意味着必须在类对象上调用它。在代码中拥有它的方式就是像调用它是自由函数或静态类一样对其进行调用。

您可以将其设置为静态类。或者您可以更改它,以便可以在friend ComplexNumber operator/(const ComplexNumber& com1, const ComplexNumber& com2)

之类的对象上调用它

将其设为私有意味着{{1}}无法对其进行调用。但是,如果将运算符放在类中并使其成为朋友,那将是可行的。像这样:

{{1}}

答案 1 :(得分:0)

编译器无法在inversion中找到operator/,因为inversionComplexNumber成员函数,需要在ComplexNumber的实例上调用。另外,它是private成员,除ComplexNumber的{​​{1}}之外,不能在ComplexNumber之外访问。

作为成员函数,friendinversion实例上进行操作,将其更改为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));
}