![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
hurley |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 6.7.2009 Репутация: нет Всего: нет |
есть класс (parent) - коллекция объектов другого класса (child).
возникла такая ситуация - из метода объекта-child при определенном условии вызывается метод объекта-колекции, в котором при определенном условии нужно произвести delete этого потомка (до завершения выполнения его метода). эта ситуация разрулится нормально ? |
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
||||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Сделать можно через посылку сообщения.
В противном случае будет некорректно Если из одного из объектов коллекции будет вызван метод контейнера, в котором этот объект коллекции будет удален, куда вернется вызов после оператора dlete? В удаленный объект? |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Этот подход требует предельной аккуратности. Во-первых, вызов delete (прямой или косвенный) из метода удаляемого объекта пройдет нормально, только если он будет самым последним. А это сложно гарантировать, особеннов в наследниках. Во-вторых, удаление объекта из коллекции редко может выполняться когда-угодно. Например, при переборе объектов коллекции, удаление текущего элемента может разрушить итератор (чтобы там не использовалось в его качестве). И обычно коллекции должны оговаривать возможность удаления объектов в процессе перебора (за счет усложнения внутренностей, конечно).
Кроме того, такой подход плох еще тем, что ошибка может вылезти гораздо позже (при изменении, казалось бы, совершенно других частей кода). И понять ее причину обычно бывает непросто. Вобщем, лучше напрячься и избежать такого дизайна Например так: в процессе обработки просто пометить объекты, которые нужно удалить, а собственно удаление выполнить позже, в каком-нибудь Idle-цикле. -------------------- ... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |