Название: перегрузка оператора + (комплексные числа) Отправлено: borik120 от Сентября 17, 2010, 17:04 В Complex.h определен класс для комлексных чисел
Код: class Complex пытаюсь использовать перегруженный опреатор для представителей класса, но не получается. заметил, что выдает разные ошибки при попытке применить к разным парам чисел к таким: 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) 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()' Надо хотя бы сделать так: Код А это, Цитировать Complex operator+(Complex a) // перегрузка оператора { Complex rez; rez.im =im +a.im; rez.re = re+ a.re; return rez; } ваще жесть) Не пишите так) Или прочитайте литературу перед тем как воять подобное) И кстати, есть уже готовое решение для класса комплексных чисел (так и называется complex) пример: Код
Вот описание этого класса: http://www.cplusplus.com/reference/std/complex/ Название: Re: перегрузка оператора + (комплексные числа) Отправлено: lit-uriy от Сентября 17, 2010, 17:45 к таким: в последней строке складываются указатели, вместо объектов (*first=*first+*second;)Complex* first = new Complex(32,43); Complex* second = new Complex(12,32); 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) или так Код: Complex operator + (const Complex& c) const Кроме того, релизация Код: Class operator + (Class second) некорректна, т.к. изменяет значение полей 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; } Не нужно Шилдта читать. Он плохой дядька по С++ |