LINUX.ORG.RU

# Перегруза оператора умножения

Ошибка при компиляции

main.cpp

``````
#include <iostream>
#include "complex.h"
using namespace std;

int main()
{
Complex x;
Complex y(4.3, 8.2);
Complex z(3.3, 1.1);

cout << x << y << z;

x = y * z;
cout << "Result: " << x << endl;

return 0;
}
``````

complex.h

``````
#ifndef COMPLEX_H
#define COMPLEX_H
#include <iostream>
using namespace std;

class Complex
{
friend ostream &operator << (ostream &, const Complex &);
friend istream &operator >> (istream &, Complex &);
public:
Complex(double = 0.0, double= 0.0);
Complex operator+(const Complex &) const;
Complex operator-(const Complex &) const;

const Complex operator*(const Complex &) const;
const Complex &operator=(const Complex &);

private:
double real;
double imaginary;
};

#endif // COMPLEX_H
``````

complex.cpp

``````
#include <iostream>
#include "complex.h"

Complex::Complex(double realPart, double imaginaryPart)
:real(realPart), imaginary(imaginaryPart)
{

}

Complex Complex::operator + (const Complex &operand2) const
{
return Complex(real + operand2.real, imaginary + operand2.imaginary);
}

Complex Complex::operator - (const Complex &operand2) const
{
return Complex(real - operand2.real, imaginary - operand2.imaginary);
}

const Complex Complex::operator*(const Complex &number) const
{
return Complex(real * number.real, imaginary * number.imaginary);
}

const Complex &Complex::operator=(const Complex &number)
{
real = number.real;
imaginary = number.imaginary;
return *this;
}

ostream &operator << (ostream &output, const Complex &number)
{
output << "The real part is: " << number.real << "\nThe imaginary part is: " << number.imaginary << "\n" << endl;
}

istream &operator >> (istream &input, Complex &number)
{
input >> number.real;
input >> number.imaginary;
}
``````

ошибка:

``````R:\Store\ToDo\examples\main.cpp:13: error: undefined reference to `Complex::operator*(Complex) const'
``````

если передавать параметр в перегруженную операцию умножения не по ссылке, то программа работает. Почему нельзя передать объект по ссылке?

Проверил твой код, УМВР. Попробуй make clean и пересобрать заново.

m0rph ★★★★★
()
Ответ на: комментарий от m0rph

Скорее всего ты конечно экспериментируешь в целях обучения, но на всякий случай напомню про std::complex.

m0rph ★★★★★
()

а еще посницо у товарища Страуструпа было как-то так:

``````friend complex operator*(complex, complex);
``````
т.е. он фрэндовал перегрузки операторов, но я не помню зачем

anonymous
()

# Оффтопа ради

Перегруза

Питер?

buddhist ★★★★★
()
Ответ на: комментарий от anonymous

Потому что так логичнее. Если, например, там не operator*(complex, complex), а operator*(scalar, vector), то какому из классов должен operator* принадлежать?

anonymous
()
Ответ на: комментарий от anonymous

Чтобы private-переменные/функции доставать. // КО

Tanger ★★★★★
()
Ответ на: комментарий от Tanger

Не. Это для преобразования типов для левого аргумента оператора.

anonymous
()

Расстановка фигурных скобок дело вкуса, но нафига такие операторы выносить в .срр и делать приватными real и imaging я не понял.

И да, комплексные числа можно умножать и тд и на обычные, так операторов там должен быть целый зоопарк, как впрочем и конструкторов;-)

AIv ★★★★★
()
Ответ на: комментарий от Tanger

Речь про френдованную функцию vs функцию-член, а не про френдованную функцию vs нефрендованную функцию.

anonymous
()
Ответ на: комментарий от anonymous

Complex operator+(const Complex &) const не вызовешь для (double, complex)

friend complex operator*(complex, complex) можно вызвать для (double, complex), если есть соответствующий конструктор.

anonymous
()
Ответ на: комментарий от anonymous

Для преобразования? В смысле для неявного приведения типа? Жаль, что оно еще не считается антипаттерном.

anonymous
()
Ответ на: комментарий от anonymous

Я бы на костре сжигал за неявное приведение.

anonymous
()
Ответ на: комментарий от anonymous

А чем оно плохо? С чего вдруг неявное преобразование 1 в комплексное число будет такой ересью, что аж сжигать надо?

anonymous
()
Ответ на: комментарий от anonymous

Это вводит двусмысленность в выражения. Например, есть выражение 1 / (somevar + 3.5). А потом оказалось, что в знаменателе 3.5 — это много, а вот 3 — это самый раз. Результат: 1 / (somevar + 3).

anonymous
()

Ты в курсе, что у тебя бред в качестве умножения комплексных чисел?

Miguel ★★★★★
()

Видна вся мощь плюсов, комплексное умножение

`````` return Complex(real * number.real, imaginary * number.imaginary);
``````
никто даже и не разглядел. Цэпэпэ такое цэпэпэ.

aedeph
()
Ответ на: комментарий от Miguel

Блин, а я и не заметил... ;-(

Ну как же, 5*5=25, 6*6=36, -> 7*7=47, 8*8=58.... и комплексные числа перемножаются тоже покомпонентно;-)

Кстати, ТС-у неплохо бы добавить exp(complex)

AIv ★★★★★
()
Ответ на: комментарий от AIv

Ну как же, 5*5=25, 6*6=36, -> 7*7=47, 8*8=58...

:-)

Neksys ★★★
()
Ответ на: комментарий от Miguel

Прелесно, просто прелесно!

anonymous
()

и вообще класс Complex ненужен :)

``````#include <stdio.h>
int main() {
_Complex double d=0.5+1.0j;
d=d*d;
printf("d=%g+%gj\n",__real__ d,__imag__ d);
return 1;
}
``````
MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

Тебе про С++ говорят, а ты лезешь с каким-то С. Это просто неприлично.

anonymous
()
Ответ на: комментарий от anonymous

про С++ говорят, а ты лезешь с каким-то С

плюса так плюса :)

``````#include <iostream>
using namespace std;
int main() {
_Complex double d=0.5+1.0j;
d=d*d;
cout << "d=" <<__real__ d<<"+"<<__imag__ d<<"j";
return 1;
}
``````
MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

А почему возвращается 1? Случилась ошибка?

cattail
()

ну сами смотрите: для выполнения умножения, компилятор хочет использовать метод с такой подписью: Complex::operator*(Complex) const

а вы ему предоставили только метод с подписью: const Complex operator*(const Complex &) const;

и вообще, что она означает?

может вам просто Complex operator*(const Complex &) const использовать?

ещё может возникнуть проблема, если компилятор сам не сможет из предложенных вами типов привести (скастовать) к тем, с которыми знает как работать (но это позже).

gunja
()
``````const Complex Complex::operator*(const Complex &number) const
{
return Complex(real * number.real, imaginary * number.imaginary);
}``````

Какая прелесть!

x4DA ★★★★★
()
Ответ на: комментарий от MKuznetsov

это что за нахрен? в каком стандарте это описано? :)

Harald ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.