11 / 11 / 3
Регистрация: 08.03.2014
Сообщений: 70
|
|||||||||||
1 | |||||||||||
Переопределение операции присваивания29.07.2014, 04:21. Показов 3866. Ответов 40
Метки нет (Все метки)
Есть вот такой класс:
Заранее спасибо. Добавлено через 7 минут Вследствие чего выводистя окно с ошибкой, как я понимаю из за того, что деструктор пытается удалить несуществующий блок памяти.
0
|
29.07.2014, 04:21 | |
Ответы с готовыми решениями:
40
Переопределение операции присваивания Переопределение оператора присваивания Для чего нужно переопределение оператора присваивания? Операции присваивания |
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
|
|
29.07.2014, 05:42 | 2 |
На каждый оператор New должен быть оператор Delete.
Не освобождаете память. Остальное не смотрел.
0
|
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495
|
||||||
29.07.2014, 05:44 | 3 | |||||
при присваивании одного объекта другому, сначала нужно очистить память, которая уже была выделена, а потом уже выделять новую, равную размеру присваемого объекта. Так-же перед всем этим следует проверить, не является ли аргумент тем-же самым объектом, если да, то и выделять ничего не нужно
1
|
11 / 11 / 3
Регистрация: 08.03.2014
Сообщений: 70
|
||||||
29.07.2014, 06:25 [ТС] | 4 | |||||
В Деструкторе присутствуют все delete-ы. Память сдесь даже переосвобождается, из за чего и проблема.
Да, удаление предыдущего содержимого забыл, но пробелма не решилась т.к. присваивал и так пустому обьекту. Дело в том что Прата не писал о переопределении операции присваения. В примерах у него просто определены разные операции присваения для базового и производных классов. Может это и не может понадобится, но мне стало интересно и захотелось попробовать написать следующий код:
0
|
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
|
|
29.07.2014, 06:34 | 5 |
0
|
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495
|
|
29.07.2014, 06:42 | 6 |
Вот ты бестыжий врёшь и не краснеешь
Как дома буду, обязательно ткну носом в эти листинги и то, где он описывал проблемы, когда выделяешь память из кучи в конструкторе а пока, перечитай главу ещё раз и повнимательней глядишь и сам найдёшь то, что я тебе выше писал
0
|
11 / 11 / 3
Регистрация: 08.03.2014
Сообщений: 70
|
|
29.07.2014, 06:46 [ТС] | 7 |
не помогло
Добавлено через 3 минуты да читал я глубокое копирование и тд. Все работает, если убрать это присвоение триклятое...Его в самом задание то нет, но оно мне спать не дает спокойно
0
|
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495
|
||||||
29.07.2014, 06:56 | 9 | |||||
И кстати, только сейчас обратил внимание. Очень ты не внимательно читаешь) Если б внимательно читал, то знал бы, что операция присваивания не наследуется, соответственно, виртуальной её не нужно объявлять. Если операция присваивания по умолчанию не переопределена, то свойства просто почленно друг друга скопируют, а если класс является производным, тогда сначала вызовется оператор присваивания базового класса, чтобы скушать свои свойства( и соответственно для него, вызовется тот оператор присваивания который определён, т.е. который написал ты или по умолчанию). Соответственно, если ты переопределяешь для производного класса оператор присваивания, тебе нужно вызвать самому оператор присваивания для базового класса
0
|
11 / 11 / 3
Регистрация: 08.03.2014
Сообщений: 70
|
|
29.07.2014, 06:57 [ТС] | 10 |
Да вроде нормально... strlen применяется только в конструкторах к указателям на строки.
0
|
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495
|
|
29.07.2014, 07:02 | 11 |
Выложи, что у тебя в итоге сейчас получается
0
|
11 / 11 / 3
Регистрация: 08.03.2014
Сообщений: 70
|
|||||||||||
29.07.2014, 07:14 [ТС] | 12 | ||||||||||
Есть там такое
Добавлено через 11 минут Вот к примеру, где могла бы использоватся переопределенная операция присваивания
0
|
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495
|
|
29.07.2014, 07:22 | 13 |
Имеет.
Выложи весь код. Покажи, что поменял от старта топика Добавлено через 3 минуты стоооооп)
0
|
11 / 11 / 3
Регистрация: 08.03.2014
Сообщений: 70
|
||||||||||||||||
29.07.2014, 07:24 [ТС] | 14 | |||||||||||||||
0
|
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495
|
|||||||||||
29.07.2014, 07:31 | 15 | ||||||||||
стоооооп) теперь я понял)
смотри.
отсюда и получается, что ptr->Report(); вызывает у тебя метод базового класса, потому-что он и хранит адрес объекта базового класса!
1
|
11 / 11 / 3
Регистрация: 08.03.2014
Сообщений: 70
|
||||||
29.07.2014, 07:37 [ТС] | 16 | |||||
Понятно, значит это смысла не имеет и впринципе переопределять операцию присваения не нужно. Но мне все же интересно это:
0
|
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495
|
|
29.07.2014, 07:54 | 18 |
В базовом классе, для производного класса определять операцию присвоения нет необходимости. Только может, если ты хочешь знать, что принял именно производный класс и в соответствии с этим сделать, что-то ещё, но, к сожалению, никакого примера придумать не могу
я рад, что ты разобрался
1
|
11 / 11 / 3
Регистрация: 08.03.2014
Сообщений: 70
|
|
29.07.2014, 08:01 [ТС] | 19 |
Нет, но strlen все равно применяется к строке в уже существующему объекту.
Добавлено через 6 минут Спасибо знать бы еще почему вызвается присвоение базового класса вместо производного Ну да ладно, если перопределние присвоения бесполезно то может и незачем знать. Просто определю не виртуальное присвоение в производном класе и все. Еще раз спасибо.
0
|
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495
|
||||||
29.07.2014, 08:12 | 20 | |||||
Я немного не понял, почему ты не понял=)
давай ещё раз:
0
|
29.07.2014, 08:12 | |
29.07.2014, 08:12 | |
Помогаю со студенческими работами здесь
20
Перегрузка операции присваивания и сложения Переопределение операции [] Переопределение операции инкремента Переопределение операции ввода Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |