|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
05.07.2011, 14:55 | #1 |
Пользователь
Регистрация: 08.10.2007
Сообщений: 11
|
Перегрузка бинарного оператора
Есть класс - реализует некую дин. структуру, похожую на дерево.
Необходимо перегрузить бинарный оператор сложения и присваивания Т.е. если А, В, С объекты данного класса. Необходимо реализовать С=А+В (в перспективе С=(А+В)-D+E&V ... ну и в таком роде). Проблема в том, что в ходе исполнения А+В, создается некий объект Х (того же класса, что и А,В,С) в который идет суммирование и ссылка на который потом возвращается. Далее уже этот объект Х передается в операторную ф-цию присваивания, где фактически создается его копия в объект С. В итоге, после выполнения С=А+В, получаем "левый" объект Х и утечку памяти. Для этого временного объекта нужно, явно вызвать деструктор, но вопрос когда и как ? Может кто сталкивался или знает красивое решение сей проблемы |
05.07.2011, 15:41 | #2 | |
C++, Java
Старожил
Регистрация: 10.04.2010
Сообщений: 2,665
|
Явно вызвать деструктор? Не перевелись ещё извращенцы на Руси...
Цитата:
Код:
|
|
05.07.2011, 15:58 | #3 | |
C++,DirectX/OpenGL
Форумчанин
Регистрация: 09.01.2011
Сообщений: 422
|
Цитата:
Код:
Последний раз редактировалось An1ka; 05.07.2011 в 17:28. |
|
05.07.2011, 17:33 | #4 | ||
Пользователь
Регистрация: 08.10.2007
Сообщений: 11
|
Цитата:
Да и при таком подходе и выражении С=А+В , как мне кажется, объект temp не попадет в operator=, т.к. выйдет из зоны видимости и самовыпилится. Цитата:
Последний раз редактировалось XuMuK; 05.07.2011 в 17:37. |
||
05.07.2011, 18:13 | #5 | |
Форумчанин
Регистрация: 01.07.2011
Сообщений: 423
|
Цитата:
Ваш пример - это пример того, как не надо перегружать операторы!
Со мной можно встретиться на www.clipper.borda.ru
|
|
05.07.2011, 18:20 | #6 | |
Форумчанин
Регистрация: 01.07.2011
Сообщений: 423
|
Цитата:
Кроме того желательно возвращать констатнтный объект, так как это более соответствует результатм операций со встроенными типами. То есть правильный код оператора суммирования будет выглядеть так: Код:
Со мной можно встретиться на www.clipper.borda.ru
Последний раз редактировалось Сыроежка; 05.07.2011 в 18:30. |
|
05.07.2011, 18:25 | #7 | |
JAVA BEAN
Участник клуба
Регистрация: 22.04.2007
Сообщений: 1,329
|
Цитата:
Код:
Код:
Там накладные расходы на создание временных объектов будут минимальны, настолько, что и передавать их в функции можно будет не по ссылке, а копиями. |
|
05.07.2011, 20:13 | #8 |
JAVA BEAN
Участник клуба
Регистрация: 22.04.2007
Сообщений: 1,329
|
Прекращаем холивар! Ещё одно сообщение из цикла "возврат ссылки/значения" и начну раздавать нарушения!
По теме: Тема была в правильной реализации операторов для дерева. Пусть автор отпишется, иначе тему закрываю. |
05.07.2011, 21:58 | #9 | |
C++,DirectX/OpenGL
Форумчанин
Регистрация: 09.01.2011
Сообщений: 422
|
Цитата:
Константный не обязательно возвращать ! При возврате константного объекта некоторые операции будут не доступны, например : (A+B).func () - которая изменяет объект. |
|
06.07.2011, 16:25 | #10 | |
Форумчанин
Регистрация: 01.07.2011
Сообщений: 423
|
Цитата:
Что касается второго вашего вопроса. Возврашение не константного объекта нарушает общепринятое представление для операций со встроенными типами. То есть общая семантика операторов нарушается. Вы же не можете выполнять такой, например, код Код:
Со мной можно встретиться на www.clipper.borda.ru
Последний раз редактировалось Сыроежка; 06.07.2011 в 17:06. |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
C++ Перегрузка оператора += и >> | Jane-sad | Помощь студентам | 4 | 01.03.2013 15:38 |
Перегрузка бинарного оператора + | EC.cpp | Общие вопросы C/C++ | 4 | 10.04.2011 00:32 |
Перегрузка оператора + | Jane-sad | Помощь студентам | 0 | 05.10.2010 13:52 |
перегрузка оператора -> | alex_alpha | Общие вопросы C/C++ | 5 | 23.06.2010 19:07 |
Перегрузка оператора | Crucian | Общие вопросы C/C++ | 2 | 22.10.2007 09:44 |