Вызовите приватный метод в публичном методе в классе - PullRequest
0 голосов
/ 02 декабря 2018

Я хочу перегрузить оператор / в классе.чтобы сделать это, я хочу определить метод частной инверсии, который вычисляет инверсию первого комплексного числа (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 голосов
/ 02 декабря 2018

Компилятор не может найти 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;
}
0 голосов
/ 02 декабря 2018

Ваша inversion функция является членом класса, что означает, что она должна вызываться для объекта класса.То, как вы это делаете в своем коде, вызывает его так, как если бы это была свободная функция или статический класс.

Вы можете сделать класс статическим.Или вы можете изменить его так, чтобы вы могли вызывать его на объекте, подобном com2.inversion()

Если сделать его закрытым, это означает, что operator/ не может вызвать его.Однако, если бы вы поместили свои операторские функции в ваш класс и подружили их, это бы сработало.Вот так:

friend ComplexNumber operator/(const ComplexNumber& com1, const ComplexNumber& com2)
...