|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
28.04.2012, 10:44 | #1 |
Новичок
Джуниор
Регистрация: 28.04.2012
Сообщений: 4
|
Перегрузка операторов
В общем проблема такая:
Помогаю знакомому с лабами по с++, гемор возник внезапно на перегрузке операторов. Есть класс, реализующий квадратную матрицу - SqMatrix в мэйне выражение s = m + m; //объекты sqmatrix Сначала вызывается сложение, где создается создается объект "r", куда вычисляется результат сложения. Если перед выходом из функции напечатать "r" все прекрасно, результат правильный. Однако почемуто перед самым выходом из функции (перед return r) почему то вызывается деструктор для r. После этого вызывается оператор присваивания, и в него передается как параметр временный объект rigth_side. Еще до входа в тело функции (стрелочка дебагера на фигурной скобке) объект rigth_side правильный, поля объекта заполнены правильными цифрами. Однако после того как делается шаг - теперь уже в теле функции, в параметре (rigth_side) лежит мусор! Я уже всю голову сломал, в перегрузке операторов не особо разбираюсь, поэтому возможно чтото упустил... main() Код:
SqMatrix.h Код:
Код:
Последний раз редактировалось SmileOn; 28.04.2012 в 10:51. |
28.04.2012, 11:10 | #2 | |
Форумчанин
Регистрация: 11.07.2010
Сообщений: 914
|
Вы отлично разбираетесь. Осталось понять, что ...
Цитата:
Убрать амперсанд из возвращаемого значения SqMatrix& operator +(....) Тем более, что конструктор копирования у Вас предусмотрен. Последний раз редактировалось EUGY; 28.04.2012 в 11:12. |
|
28.04.2012, 11:23 | #3 |
Новичок
Джуниор
Регистрация: 28.04.2012
Сообщений: 4
|
Спасибо. Теперь разобрался. Правда, когда создается копия, для возврата, сразу вызывается конструктор копирования, в котором первым делом освобождается память от старых данных, а тут этих данных понятное дело нет, там мусор, ну и фатал еррор как следствие. Ну это уже вопросы реализации. Это можно было бы решить флагами (если хоть один стандартный конструктор вызывался, то выставляем флаг и в конструкторе копирования память очищаем, если же конструктор копирования - это первый конструктор, который вызвался для этого объекта, то память не очищаем. Но если ни одного конструктора не вызывалось то как инициализировать флаг? Может быть есть другой, более правильный механизм?
Последний раз редактировалось SmileOn; 28.04.2012 в 11:32. |
28.04.2012, 11:32 | #4 |
Форумчанин
Регистрация: 11.07.2010
Сообщений: 914
|
Члены ptr и size во всех типах конструкторов проинициализируйте нулем.
Чтобы при вызове memfree не напороться на ошибку. Впрочем, я вот с первого раза и не вижу, зачем ее вообще вызывать в конструкторах. |
28.04.2012, 11:35 | #5 |
Новичок
Джуниор
Регистрация: 28.04.2012
Сообщений: 4
|
Сейчас попробую определить конструктор по умолчанию, возможно это поможет, если он вызовется до конструктора копирования
|
28.04.2012, 11:40 | #6 | |
Новичок
Джуниор
Регистрация: 28.04.2012
Сообщений: 4
|
Цитата:
Теперь я понял наконец, почему присваивание не определяют как friend, а определяют как член класса |
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
перегрузка операторов C++ | Kingdom_Reborn | Помощь студентам | 0 | 29.09.2011 20:58 |
Перегрузка операторов | _-Re@l-_ | Паскаль, Turbo Pascal, PascalABC.NET | 11 | 20.11.2010 13:23 |
перегрузка операторов | mashuta_ya | Общие вопросы C/C++ | 0 | 01.10.2010 18:54 |
Перегрузка операторов. | Macb3th | Общие вопросы C/C++ | 5 | 01.04.2010 21:14 |
Перегрузка операторов, Организация перегрузки операторов | chagin_yav | Помощь студентам | 2 | 12.05.2008 09:15 |