#include
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*i1) / (r2*r2 + i2*i2), (-r1*i2 + i1*r2) / (r2*r2 + i2*i2));
}
complex complex::operator^(unsigned n)
{
complex y(1, 0);
for (int i = 1; i <= n; i++)
y = y*(*this);
return y;
}
istream& operator >> (istream& is, complex& x)
{
char c;
cin >> c;
assert(c == '(');
cin >> x.re;
cin >> c;
assert(c == ',');
cin >> x.im;
cin >> c;
assert(c == ')');
return is;
}
ostream& operator<<(ostream&os, complex&x)
{
os << '(' << x.re << ',' << x.im << ')' << endl;
return os;
}
int main(){
complex a(1, 1);
complex b(1, 1);
complex c(1, 1);
complex x;
cout << "Введите комплексное число в формате: (re,im) ->";
cin >> x;
cout << "Результат =" << a*(x ^ 2)) + b*x + c << endl;
return 0;
}
На линуксе выводит ошибку:
invalid initialization of non-const
для строки:
cout << "Результат =" << a*(x ^ 2) + b*x + c << endl;
Саму программу скопировал с Windows, ошибки исправил, только эту выдает. В чем здесь проблема? И как можно ее решить? На Visual Studio работала нормально.
Ответ
Объявите данные операторы следующим образом
complex operator+( const complex&) const;
complex operator-(const complex&) const;
complex operator*(const complex&) const;
complex operator/( const complex&) const;
complex operator ^( unsigned int ) const;
friend ostream& operator << (ostream &, const complex &);
Нельзя связывать временные объекты с неконстантной lvalue ссылкой.
Обратите внимание , что конструктор класса является преобразующим конструктором. Поэтому у вас будет работать выражение complex + double, как, например,
complex a( 10, 10 );
complex b = a + 10;
Но не будет работать выражение double + complex
complex a( 10, 10 );
complex b = 10 + a; // ошибка компиляции
так как ваши операторы являются членами класса. Вы могли бы их объявить как отдельные функции, не являющиеся членами класса, которые принимают два аргумента. Например,
friend complex operator +( const complex &lhs, const complex &rhs )
{
return complex( lhs.re + rhs.re, lhs.im + rhs.im );
}
В этом случае второе выражение было бы также верным.
Эта дружественная функция может быть определена как в самом классе, и тогда при использовании оператора будет применен зависящий от аргумента поиск (ADL), либо вне класса.
Что касается Visual Studio, то его компилятор имеет собственные расширения языка (которые активизированы по умолчанию; вы можете отключить эту опцию в настройках компилятора, и тогда будет выдано сообщение об ошибке), которые порой противоречат стандарту C++. Не стоит полагаться на эти расширения языка компилятора C++ Visual Studio, так как код будет не переносимым.
EDIT: Так как у вас возникают трудности правильно набрать код, то приведу для вас рабочий вариант программы. Я не проверял, определены ли правильно операторы с точки зрения математики.
#include
class complex
{
private:
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 int ) const;
friend std::istream & operator >>( std::istream &, complex & );
friend std::ostream & operator <<( std::ostream &, const complex & );
};
complex::complex( double r, double i ) : re( r ), im( i )
{
}
complex::~complex() { }
complex complex::operator +( const complex &c ) const
{
return complex( re + c.re, im + c.im );
}
complex complex::operator -( const complex &c ) const
{
return complex( re - c.re, im - c.im );
}
complex complex::operator *( const complex &c ) const
{
return complex( re * c.re - im * c.im, re * c.im + im * c.re );
}
complex complex::operator /( const complex & c ) const
{
double r1 = re;
double i1 = im;
double r2 = c.re;
double i2 = c.im;
return complex( ( r1 * r2 - i1 * i1 ) / ( r2 * r2 + i2 * i2 ),
(-r1 * i2 + i1 * r2 ) / ( r2 * r2 + i2 * i2 ) );
}
complex complex::operator ^( unsigned int n ) const
{
complex c( 1, 0 );
for ( unsigned int i = 1; i <= n; i++ ) c = c * *this;
return c;
}
std::istream & operator >>( std::istream &is, complex &c )
{
char ch;
is >> ch;
assert( ch == '(' );
is >> c.re;
is >> ch;
assert( ch == ',' );
is >> c.im;
is >> ch;
assert( ch == ')' );
return is;
}
std::ostream & operator <<( std::ostream &os, const complex &c )
{
return os << '(' << c.re << ',' << c.im << ')';
}
int main()
{
complex a(1, 1);
complex b(1, 1);
complex c(1, 1);
complex x;
std::cout << "Введите комплексное число в формате: (re,im) ->";
std::cin >> x;
std::cout << "x = " << x << std::endl;
std::cout << "x ^ 2 = " << ( x ^ 2 ) << std::endl;
std::cout << "a * ( x ^ 2 ) = " << a * ( x ^ 2 ) << std::endl;
std::cout << "b * x = " << b * x << std::endl;
std::cout << "a * ( x ^ 2 ) + b * x = " << a * ( x ^ 2 ) + b * x << std::endl;
std::cout << "Результат =" << a * ( x ^ 2 ) + b * x + c << std::endl;
return 0;
}
Если ввести значение (10,10), то вывод будет выглядеть следующим образом:
Введите комплексное число в формате: (re,im) ->(10,10)
x = (10,10)
x ^ 2 = (0,200)
a * ( x ^ 2 ) = (-200,200)
b * x = (0,20)
a * ( x ^ 2 ) + b * x = (-200,220)
Результат =(-199,221)
Комментариев нет:
Отправить комментарий