cout функция класса - PullRequest
       21

cout функция класса

1 голос
/ 11 октября 2019

У меня есть домашнее задание по ИТ для школы, но я столкнулся с проблемой кутинга. Программа должна вычислять комплексные числа.

#include <iostream>
#include <cmath>
#include <complex>

using namespace std;

class Complex
{

public:
    Complex()
    {
        Re = 0;
        Im = 0;
    }

    Complex(float r, float i) 
    {
        Re = r;
        Im = i;
    }

    void SetRe(float n)
    {
        Re = n;
    }

    float GetRe()
    {
        return Re;
    }

    void SetIm(float n)
    {
        Im = n;
    }

    float GetIm()
    {
        return Im;
    }

    float GetR()
    {
        float r;
        float ar = pow(Re, 2);
        float br = pow(Im, 2);
        r = sqrt(ar + br);

        return r;
    }

    float GetPhi()
    {
        float phi;
        phi = atan2(Im, Re);
        phi = phi * 180 / 3.1415;
        return phi;
    }

    Complex add(Complex s2)
    {
        Complex sum(Re + s2.Re, Im + s2.Im);
        return sum;
    }

private:
    float Re;
    float Im;

};

int main()
{
    float im = 0;
    float re = 0;
    cout << " Enter Real: ";
    cin >> re;
    cout << " Enter Imag: ";
    cin >> im;
    for (int i = 0; i < 30; i++)
    {
        cout << "=";
    }
    cout << endl;

    Complex z1 = Complex(re, im);

    cout << " z1: " << z1.GetRe() << " + " << z1.GetIm() << "i" << endl;
    cout << " r: " << z1.GetR() << endl;
    cout << " Phi: " << z1.GetPhi() << endl;

    cout << " Enter Real: ";
    cin >> re;
    cout << " Enter Imag: ";
    cin >> im;

    Complex z2 = Complex(re, im);

    Complex z;

    cout << z1.add(z2); //This gives the error

    cout << " z2: " << z2.GetRe() << " + " << z2.GetIm() << "i" << endl;
    cout << " r: " << z2.GetR() << endl;
    cout << " Phi: " << z2.GetPhi() << endl;


    cout << endl;
}

Я хочу, чтобы отображалась функция z1.add(z2);, но Xcode говорит:

Недопустимые операнды для двоичного выражения ('std ::__1 :: ostream '(aka' basic_ostream ') и' Complex ')

Если я удаляю cout << z1.add(z2);, все работает нормально.

Ответы [ 2 ]

3 голосов
/ 11 октября 2019

Вы не определили operator << для своего класса Complex. Таким образом, компилятор не знает, как вывести объект класса.

Вы можете определить его, например, следующим образом

std::ostream & operator <<( std::ostream &os, const Complex &c )
{
    return os << "{ " << c.GetRe() << ", " << c.GetIm() << "i }";
}

Для этого функции-члены GetRe и GetIm должно быть объявлено с квалификатором const. Например,

float GetRe() const
{
    return Re;
}

float GetIm() const
{
    return Im;
}

После этого вы можете написать

std::cout << z1.add(z2) << '\n'; 

Обратите внимание, что функция-член add также должна быть объявлена ​​как

Complex add( const Complex &s2 ) const 
{
    Complex sum(Re + s2.Re, Im + s2.Im);
    return sum;
}

Илипросто

Complex add( const Complex &s2 ) const 
{
    return { Re + s2.Re, Im + s2.Im };
}
0 голосов
/ 11 октября 2019

Поскольку возвращаемое значение вашего add метода - Complex object, вы должны перегрузить оператор <<. </p>

ostream & operator << (ostream &out, Complex const& c)
{
    out << c.Re;
    out << "+i" << c.Im << endl;
    return out;
}
...