LINUX.ORG.RU

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


0

1

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

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)
{
    cout << "Please enter real part of your number: ";
    input >> number.real;
    cout << "Please enter imaginary part of your number: ";
    input >> number.imaginary;
}

ошибка:

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

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

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

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

m0rph ★★★★★
()

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

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

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

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

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

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

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

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

anonymous
()

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

 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 ★★★★★
()

и вообще класс 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 ★★★★★
()
Ответ на: комментарий от 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 ★★★★★
()

ну сами смотрите: для выполнения умножения, компилятор хочет использовать метод с такой подписью: 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 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.