Не могу понять ошибку! Visual С++

Задание

Создать класс - комплексные числа. Определить необходимые конструкторы и деструктор. Перегрузить поточные операции ввода и вывода, операции +, -, *, / и ^. Вычислить значение выражения у = а * х2 + b * х + с для комплексных коэффициентов a, b, c в комплексной точке х.

Код

#include <iostream>
#include <assert.h>
using namespace std;

class complex
{
double re, im;
public:
complex(double=0,double=0);
~complex();
complex operator +(complex&);
complex operator -(complex&);
complex operator *(complex&);
complex operator /(complex&);
complex operator ^(unsigned);
friend istream& operator >>(istream&,complex&);
friend ostream& operator <<(ostream&,complex&);
};

complex::complex(double r, double i)
{
re=r; im=i;
}

complex::~complex()
{

}

complex complex::operator +(complex& y)
{
return complex(re+y.re, im+y.im);
}

complex complex::operator -(complex& y)
{
return complex(re-y.re, im-y.im);
}

complex complex::operator *(complex& y)
{
return complex(re*y.re-im*y.im, re*y.im+im*y.re);
}

complex complex::operator /(complex& y)
{
double r1=re;
double i1=im;
double r2=y.re;
double i2=y.im;
return complex((r1*r2-i1*i2)/(r2*r2+i2*i2),(-r1*i2+i1*r2)
/(r2*r2+i2*i2));
}

complex complex:: operator^(unsigned n)
{
complex y(1,0);
for(unsigned i=1;i<=n;i++)
y=y*(*this);
return y;
}

istream& operator >>(istream& is, complex& x)
{
char c;
is>>x.re;
cin>>c;
assert(c==',');
is>>x.im;
return is;
}

ostream& operator <<(ostream& os, complex& x)
{
os<<x.re<<','<<x.im<<endl;
return os;
}

int main()
{
complex a(1,1), b(1,1), c(1,1);
complex x;
cout<<"Введите комплексное число в формате: re,im ";
cin>>x;
cout<<"Результат = "<<a * (x ^ 2) + b * x + c <<endl;
return 0;
}

Ошибки

cout<<"Результат = "<<a * (x ^ 2) + b * x + c <<endl;

Ошибка (активно) E0349 отсутствует оператор "*", соответствующий этим операндам

Ошибка C2679 бинарный "*": не найден оператор, принимающий правый операнд типа "complex" (или приемлемое преобразование отсутствует)

введите сюда описание изображения


Ответы (1 шт):

Автор решения: AR Hovsepyan

Вы пытаетесь выполнить операции с результатом операции, возвращающей временную переменную. Можно так:

complex n(x ^ 2), res1(a * n), n2(b*x), res2(n2 + c);
cout << "Результат = " << res1 + res2 << endl;

И друзья вы определяете вне класса, поэтому их нужно объявлять до определения класса. Жизнь временных объектов можно продлить, используя константную ссылку. Чтобы выполнить цепочку операций, код нужно написать логически уместным(если функция не модифицирует объект, передайте по значению или по константной ссылке).

class complex
{
    double re, im;
public:
    complex(double = 0, double = 0);
    ~complex();
    complex operator +(const complex&) const;
    complex operator -(const complex&) const;
    complex operator *(const complex&) const;
    complex operator /(const complex&) const;
    complex operator ^(unsigned) const;
    friend istream& operator >>(istream& is, complex& x)
    {
        char c;
        is >> x.re;
        cin >> c;
        is >> x.im;
        return is;
    }
    friend ostream& operator <<(ostream& os, const complex& x)
    {
        os << x.re << ',' << x.im << endl;
        return os;
    }
};
complex::complex(double r, double i) 
{
    re = r; im = i;
}

complex::~complex()
{

}

complex complex::operator +(const complex& y) const
{
    return complex(re + y.re, im + y.im);
}

complex complex::operator -(const complex& y) const
{
    return complex(re - y.re, im - y.im);
}

complex complex::operator *(const complex& y) const
{
    return complex(re * y.re - im * y.im, re * y.im + im * y.re);
}

complex complex::operator /(const complex& y) const
{
    double r1 = re;
    double i1 = im;
    double r2 = y.re;
    double i2 = y.im;
    return complex((r1 * r2 - i1 * i2) / (r2 * r2 + i2 * i2), (-r1 * i2 + i1 * r2)
        / (r2 * r2 + i2 * i2));
}

complex complex:: operator^(unsigned n) const
{
    complex y(1, 0);
    for (unsigned i = 1; i <= n; i++)
        y = y * (*this);
    return y;
}
int main() { 
    complex a(1, 1), b(1, 1), c(1, 1);
    complex x;    
    cin >> x;    
    cout  << a * (x ^ 2) + b * x + c << endl;
    return 0;
}
→ Ссылка