Russian Qt Forum

Программирование => С/C++ => Тема начата: borik120 от Сентябрь 17, 2010, 17:04



Название: перегрузка оператора + (комплексные числа)
Отправлено: borik120 от Сентябрь 17, 2010, 17:04
В Complex.h определен класс для комлексных чисел
Код:
 class Complex
{
     public:
Complex();
~Complex();
Complex(double a, double b) //конструктор с параметрами
{this->re = a;
 this->im = b;
}
double re,im; //действительная мнимая
double mo,gr; //модуль градусы
//QString ComplexPrint(Complex a);




Complex operator+(Complex a)      // перегрузка оператора
{
    Complex rez;
    rez.im =im +a.im;
    rez.re = re+ a.re;
    return rez;
}


};

пытаюсь использовать перегруженный опреатор для представителей класса, но не получается.
заметил, что выдает разные ошибки при попытке применить к разным парам чисел
к таким:
Complex* first = new Complex(32,43);
Complex* second  = new Complex(12,32);
first=first+second;

и таким
Complex third(34,54);
Complex fourth(12,43);
third=third+fourth;

в первом случае ошибка  error: invalid operands of types `Complex*' and `Complex*' to binary `operator+'
во втором C:/Qt/2009.03/mingw/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/bits/stl_algobase.h:(.text$_ZN7ComplexplES_[Complex::operator+:-1: error: undefined reference to `Complex::Complex()'
я понимаю, только то что в первом случае я создаю переменные в куче, а во втором в стеке. а какую разницу это имеет относительно применяемой к этим переменным функциям не знаю.
p.s. долго сомневался в какой теме писать(в вопросах ноичков, или c/c++, написал сюда).
Так вот как можно этот опреатор перегрузить?
заранее спасибо.





Название: Re: перегрузка оператора + (комплексные числа)
Отправлено: Denjs от Сентябрь 17, 2010, 17:15
а если разнести описание класса Complex на 2 файла - как положено? на Complex.h + Complex.cpp ?

и судя по тому как определеяется + для QPoint (qpoint.h в исходниках QT)
Код:
inline const QPoint operator+(const QPoint &p1, const QPoint &p2)
{ return QPoint(p1.xp+p2.xp, p1.yp+p2.yp); }
похоже что так может заработать:
Complex &operator+(const Complex &a)

PS:увы мои познания в С++ иногда страдают пробелами, потому прошу прощения если сморозил глупости)


Название: Re: перегрузка оператора + (комплексные числа)
Отправлено: m_ax от Сентябрь 17, 2010, 17:33
Цитировать
в первом случае ошибка  error: invalid operands of types `Complex*' and `Complex*' to binary `operator+'
во втором C:/Qt/2009.03/mingw/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/bits/stl_algobase.h:(.text$_ZN7ComplexplES_[Complex::operator+:-1: error: undefined reference to `Complex::Complex()'
Ошибка из-за того, что не определён конструктор по умолчанию (он у вас просто объявлен, как и деструктор).
Надо хотя бы сделать так:
Код
C++ (Qt)
public:
   Complex() {}
   ~Complex() {}
...
 
А это,
Цитировать
Complex operator+(Complex a)      // перегрузка оператора
{
    Complex rez;
    rez.im =im +a.im;
    rez.re = re+ a.re;
    return rez;
}
 
ваще жесть) Не пишите так) Или прочитайте литературу перед тем как воять подобное)

И кстати, есть уже готовое решение для класса комплексных чисел (так и называется complex)
пример:
Код
C++ (Qt)
#include <complex>
#include <iostream>
 
using namespace std;
 
int main() {
   complex<double> c1(1.0, 2.0);
   complex<double> c2 = c1;
   c2 += 1.0;
   cout << c1 << endl;
   cout << c2 << endl;
   return 0;
}
 

Вот описание этого класса: http://www.cplusplus.com/reference/std/complex/


 


Название: Re: перегрузка оператора + (комплексные числа)
Отправлено: lit-uriy от Сентябрь 17, 2010, 17:45
к таким:
Complex* first = new Complex(32,43);
Complex* second  = new Complex(12,32);
first=first+second;
в последней строке складываются указатели, вместо объектов (*first=*first+*second;)


Название: Re: перегрузка оператора + (комплексные числа)
Отправлено: borik120 от Сентябрь 17, 2010, 18:04
С конструктором\деструктором разобрался, спасибо.
Только вот не пойму, почему компилятор требует чтобы в перегрузке оператора + был 1н параметр?


Название: Re: перегрузка оператора + (комплексные числа)
Отправлено: Авварон от Сентябрь 17, 2010, 19:11
потому что вам надо почитать страуструпа или шилдта...
оператор+ - двуместный. Когда вы объявляете его НЕ как член касса, вам надо писать Class operator+ (Class first, Class second)
Когда вы объявляете его как член класса, одним из параметров становится this:
Class operator+(Class second) { this->im += second.im; this->re += second.re; return this; }


Название: Re: перегрузка оператора + (комплексные числа)
Отправлено: BRE от Сентябрь 17, 2010, 19:22
Class operator+(Class second) { this->im += second.im; this->re += second.re; return this; }
Звездочку пропустил.  :)
Class operator+(Class second) { this->im += second.im; this->re += second.re; return *this; }


Название: Re: перегрузка оператора + (комплексные числа)
Отправлено: MoPDoBoPoT от Сентябрь 17, 2010, 19:49
Class operator+(Class second) { this->im += second.im; this->re += second.re; return *this; }
А зачем менять значения первого операнда операции "+"?


Название: Re: перегрузка оператора + (комплексные числа)
Отправлено: Авварон от Сентябрь 18, 2010, 20:54
страуструп сказал:)
Class a, b, c;
c = a + b; // a будет автоматом скопирован и уже от копии будет вызван operator+


Название: Re: перегрузка оператора + (комплексные числа)
Отправлено: Anchorite от Сентябрь 19, 2010, 11:12
потому что вам надо почитать страуструпа или шилдта...
оператор+ - двуместный. Когда вы объявляете его НЕ как член касса, вам надо писать Class operator+ (Class first, Class second)
Когда вы объявляете его как член класса, одним из параметров становится this:
Class operator+(Class second) { this->im += second.im; this->re += second.re; return this; }

Приведенные примеры обладают парой недостатков:
1. Не работают с константами.
2. При их использовании происходят излишние операции копирования (параметры, возвращаемое значение).

Правильнее будет так:

Код:
Complex operator + (const Complex& c1, const Complex& c2)
{
    return Complex(c1.re + c2.re, c1.im + c2.im);
}

или так

Код:
Complex operator + (const Complex& c) const
{
    return Complex(re + c.re, im + c.im);
}

Кроме того, релизация

Код:
Class operator + (Class second) 
{
    this->im += second.im;
    this->re += second.re;
    return *this;
}

некорректна, т.к. изменяет значение полей re и im экземпляра объекта, чего она делать не должна.


Название: Re: перегрузка оператора + (комплексные числа)
Отправлено: borik120 от Сентябрь 19, 2010, 12:00
Цитировать
Код:
Class operator + (Class second)
{
    this->im += second.im;
    this->re += second.re;
    return *this;
}

некорректна, т.к. изменяет значение полей re и im экземпляра объекта, чего она делать не должна.
а я ломал голову почему эти поля изеняются.


Название: Re: перегрузка оператора + (комплексные числа)
Отправлено: Авварон от Сентябрь 19, 2010, 23:01

некорректна, т.к. изменяет значение полей re и im экземпляра объекта, чего она делать не должна.

давно это? во всех примерах на перегрузку операторов именно такой код. И он работает

added: хм, походу пора освежить знания 2го курса... был неправ (3 года прошло как я перегружал операторы)


Название: Re: перегрузка оператора + (комплексные числа)
Отправлено: Alex_cs_gsp от Сентябрь 20, 2010, 01:23
потому что вам надо почитать страуструпа или шилдта...
оператор+ - двуместный. Когда вы объявляете его НЕ как член касса, вам надо писать Class operator+ (Class first, Class second)
Когда вы объявляете его как член класса, одним из параметров становится this:
Class operator+(Class second) { this->im += second.im; this->re += second.re; return this; }

Не нужно Шилдта читать. Он плохой дядька по С++