Название: Перегрузка оператора * Отправлено: Даниил от Октября 09, 2011, 17:20 Здравствуйте.
Пишу класс, для работы с простыми дробями. Застрял на перегрузке операторов. Стандартная ситуация: необходимо выполнять математический оператор и возвращать полученное значение. Класс: Код Реализация: Код
Main: Код Внимание, вопрос: как осуществить умножение, не изменяя первый операнд? Название: Re: Перегрузка оператора * Отправлено: Nimbus от Октября 09, 2011, 17:29 >TFrac& operator * (TFrac &other);
>TFrac& TFrac::operator *(TFrac const &other) А оно вообще "конпелируется"? :) Надо так: Код Если конечно твой конструктор TFrac(int a, int b) инициализирует числитель и знаменатель ;) Название: Re: Перегрузка оператора * Отправлено: Даниил от Октября 09, 2011, 17:36 >TFrac& operator * (TFrac &other); >TFrac& TFrac::operator *(TFrac const &other) А оно вообще "конпелируется"? :) Если конечно твой конструктор TFrac(int a, int b) инициализирует числитель и знаменатель ;) Оно компилириуется, а вот так как ты указал - нет. Код: TFrac.cpp:194: ошибка: invalid initialization of non-const reference of type 'TFrac&' from a temporary of type 'TFrac' Название: Re: Перегрузка оператора * Отправлено: Nimbus от Октября 09, 2011, 17:41 Оно компилириуется, а вот так как ты указал - нет. Пардон. Убери из объявления возвращаемого значения ссылку (&), т. е.:Код: TFrac.cpp:194: ошибка: invalid initialization of non-const reference of type 'TFrac&' from a temporary of type 'TFrac' TFrac operator * (const TFrac &other) const; и TFrac TFrac::operator *(const TFrac &other) const Название: Re: Перегрузка оператора * Отправлено: kambala от Октября 09, 2011, 17:43 потому что в коде JC присутствует & - ссылка на временную переменную, что и сказано в ошибке. убирание амперсанда всё решит.
оператор присваивания тоже весело объявлен у тебя :) Код
Название: Re: Перегрузка оператора * Отправлено: Даниил от Октября 09, 2011, 17:45 потому что в коде JC присутствует & - ссылка на временную переменную, что и сказано в ошибке. убирание амперсанда всё решит. оператор присваивания тоже весело объявлен у тебя :) Код
Лять ... из-за тебя еще и оператор != перегружать ;D Да, кстати такой код работает ТОЛЬКО в таком виде: Код А так, как у меня написано: Код Вываливается ошибка: Код: main.cpp:13: ошибка: no match for 'operator=' in 'third = first.TFrac::operator*(((const TFrac&)((const TFrac*)(& second))))' Название: Re: Перегрузка оператора * Отправлено: kambala от Октября 09, 2011, 17:49 там сравнение указателей ;)
Название: Re: Перегрузка оператора * Отправлено: Nimbus от Октября 09, 2011, 17:56 Код
Название: Re: Перегрузка оператора * Отправлено: Даниил от Октября 09, 2011, 17:59 Логично, потому что это дефолтный конструктор копирования вызывается. Спасибо, за справку.А как недефолтный сделать? ;) Название: Re: Перегрузка оператора * Отправлено: Nimbus от Октября 09, 2011, 18:02 А как недефолтный сделать? ;) Перегрузи, если ещё не перегружен. И реализуй его так же как operator=. Только там не нужно проверять адрес и возвращать значение.И вообще, это незачем, если нет нужды в глубоком копировании. Проблема в чём-то другом. Почему он указал ((const TFrac&)((const TFrac*)(& second))), в частности звёздочку - вот это интересно. И почему там second, а не other? ;) Название: Re: Перегрузка оператора * Отправлено: Igors от Октября 09, 2011, 19:21 Возвращение ссылки лучше оставить для оператора *= а умножение (и др. арифметику) сделать так
Код
Также Код
Название: Re: Перегрузка оператора * Отправлено: Даниил от Октября 09, 2011, 19:52 Собственно проблему не решает, по прежнему ругается на присваивание:
Код: main.cpp:13: ошибка: no match for 'operator=' in 'third = operator*(((const TFrac&)((const TFrac*)(& first))), ((const TFrac&)((const TFrac*)(& other))))' Название: Re: Перегрузка оператора * Отправлено: Nimbus от Октября 10, 2011, 04:18 Собственно проблему не решает, по прежнему ругается на присваивание: Выложи уже свой код полностьюКод: main.cpp:13: ошибка: no match for 'operator=' in 'third = operator*(((const TFrac&)((const TFrac*)(& first))), ((const TFrac&)((const TFrac*)(& other))))' Название: Re: Перегрузка оператора * Отправлено: Даниил от Октября 10, 2011, 06:35 Выложи уже свой код полностью Не думаю, что вы там что-то новое увидите.Название: Re: Перегрузка оператора * Отправлено: Nimbus от Октября 10, 2011, 07:04 Не думаю, что вы там что-то новое увидите. То-то и оно, что проблема в operator=, потому что ты оставил свой вариант, а не сделал как посоветовал kambala тут (http://www.prog.org.ru/index.php?topic=19665.msg133015#msg133015)Он должен возвращать TFrac&, а у тебя он void возвращает ;) Название: Re: Перегрузка оператора * Отправлено: Даниил от Октября 10, 2011, 07:08 Он должен возвращать TFrac&, а у тебя он void возвращает ;) Один хрен. Ошибка та же.Вай, заработало) Недоглядел чуток. Спасибо всем. Название: Re: Перегрузка оператора * Отправлено: Даниил от Октября 10, 2011, 07:48 Вылез другой вопрос, не совсем к теме, но все же.
Как впилить описание friend метода, вне класса? Код Как указал Igors, работает вполне себе ничего. А вот если я описание метода выношу в другой файл. (Нужно мне так!) Код Вылазиет ошибка: Код: TFrac.cpp:154: ошибка: 'TFrac TFrac::operator*(const TFrac&, const TFrac&)' must take either zero or one argument Название: Re: Перегрузка оператора * Отправлено: Nimbus от Октября 10, 2011, 08:26 Если оператор friend, то он не является членом класса.
Описание в .h(.hpp) Код Реализация в .cpp Код
Название: Re: Перегрузка оператора * Отправлено: Даниил от Октября 10, 2011, 08:38 Спасибо. Больше вопросов нет.
|