Russian Qt Forum
Ноябрь 23, 2024, 08:38 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: перегрузка оператора + (комплексные числа)  (Прочитано 13421 раз)
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++, написал сюда).
Так вот как можно этот опреатор перегрузить?
заранее спасибо.



Записан
Denjs
Гость
« Ответ #1 : Сентябрь 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:увы мои познания в С++ иногда страдают пробелами, потому прошу прощения если сморозил глупости)
« Последнее редактирование: Сентябрь 17, 2010, 17:30 от Denjs » Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #2 : Сентябрь 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/


 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Сентябрь 17, 2010, 17:45 »

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

Юра.
borik120
Гость
« Ответ #4 : Сентябрь 17, 2010, 18:04 »

С конструктором\деструктором разобрался, спасибо.
Только вот не пойму, почему компилятор требует чтобы в перегрузке оператора + был 1н параметр?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #5 : Сентябрь 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; }
Записан
BRE
Гость
« Ответ #6 : Сентябрь 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; }
Записан
MoPDoBoPoT
Гость
« Ответ #7 : Сентябрь 17, 2010, 19:49 »

Class operator+(Class second) { this->im += second.im; this->re += second.re; return *this; }
А зачем менять значения первого операнда операции "+"?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #8 : Сентябрь 18, 2010, 20:54 »

страуструп сказал:)
Class a, b, c;
c = a + b; // a будет автоматом скопирован и уже от копии будет вызван operator+
Записан
Anchorite
Гость
« Ответ #9 : Сентябрь 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 экземпляра объекта, чего она делать не должна.
« Последнее редактирование: Сентябрь 19, 2010, 11:41 от Anchorite » Записан
borik120
Гость
« Ответ #10 : Сентябрь 19, 2010, 12:00 »

Цитировать
Код:
Class operator + (Class second)
{
    this->im += second.im;
    this->re += second.re;
    return *this;
}

некорректна, т.к. изменяет значение полей re и im экземпляра объекта, чего она делать не должна.
а я ломал голову почему эти поля изеняются.
« Последнее редактирование: Сентябрь 19, 2010, 13:01 от borik120 » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #11 : Сентябрь 19, 2010, 23:01 »


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

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

added: хм, походу пора освежить знания 2го курса... был неправ (3 года прошло как я перегружал операторы)
« Последнее редактирование: Сентябрь 19, 2010, 23:09 от Авварон » Записан
Alex_cs_gsp
Гость
« Ответ #12 : Сентябрь 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; }

Не нужно Шилдта читать. Он плохой дядька по С++
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.1 секунд. Запросов: 23.