![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| BabySG |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 26.9.2005 Репутация: нет Всего: нет |
Собственно: имеется примерно такое
Так вот, стоит вопрос: при выполнении определенных условий, объект класса Derived может захотеть удалиться. Где это лучше сделать? В точке А или точке Б? PS. В Derived::a() ОБЯЗАТЕЛЬНО в конце должна вызваться функция базового... |
|||
|
||||
| __Sergey__ |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 67 Регистрация: 21.1.2005 Репутация: нет Всего: 4 |
я балдею! когда это было, чтобы объект действовал "по своему усмотрению", а не так как его запрограммировали. или я чего-то не понял, или формулируй вопрос правильно а вообще-то весьма жутковатая схема построения классов ;) Это сообщение отредактировал(а) __Sergey__ - 4.10.2005, 23:28 |
|||
|
||||
| np9mi7 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
Попытка удаление самого себя - ошибка проектирования;
Лучше напиши некое подобие владельца объекта, который бы смотрел на то чем владеет и принимал решение об удалении; Вообще не понятен кусок кода:
|
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Чур меня чур. Точка А в данном контексте эквивалентна точке Б.
А вообще ничего, что после освобождения состояние памяти будет неопределено и вызов Base::a() может закончится крахом? -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| BabySG |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 26.9.2005 Репутация: нет Всего: нет |
http://forum.vingrad.ru/index.php?showtopi...&hl=delete+this Добавлено @ 07:57
К примеру - есть окно, при нажатии на кнопку закрытия окна окно должно закрыться. |
||||||
|
|||||||
| np9mi7 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
|
|||
|
||||
| BabySG |
|
||||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 26.9.2005 Репутация: нет Всего: нет |
См. мой ответ по поводу владельца выше. А насчет ABC::destroy() Выглядит на самом деле так:
Рассматривался вопрос недалеко тут в форуме... Добавлено @ 08:01
В данном случае равнозначно удалению. Нужно освободить память - так как таких окон много. |
||||||||||
|
|||||||||||
| Mayk |
|
||||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
google.com. мы будем обсуждать вопрос или раскидываться ссылками без объяснений что к чему? Смотрим по данной ссылке:
Base::a() обратится к какой-нить ф-ции из виртальной таблицы и "здравствуй дебагер"
Ну так освобождай в конце ф-ции. После вызовы base::a, или вне ф-ции. Это сообщение отредактировал(а) Mayk - 5.10.2005, 08:25 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||||
|
|||||||
| BabySG |
|
||||||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 26.9.2005 Репутация: нет Всего: нет |
Никаких обид - текст порезался после ссылки. Привёл её к тому, что в варианте с членами-данными может еще прокатит. Вот и интересно стало - что насчет функций.
так в том-то и вопрос, что base::a должно быть последней строкой. Т.е. нужен вариант, а-ля:
, а вот так не катит:
|
||||||||||||
|
|||||||||||||
| Mayk |
|
||||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Дык это тоже не катат, если нет гарантии, что base::a не обращается к данным/vtable. Прога (если повезет) просто вылетит(ибо состояние памяти не определено).
вот это выдает 0, а не 657. Что делает Base::A? Почему он должен вызываться после delete? Ведь после delete объекта уже нет. А такой вариант не пойдёт
Выглядит надо сказать уродски. -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||||
|
|||||||
| BabySG |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 26.9.2005 Репутация: нет Всего: нет |
Решил я проблемку. В итоге получилось (на пальцах) примерно так: В ABC::Destroy() объект, который хочет удалиться, ставиться на пометку в очередь таких же. По окончанию обработки "окон", просматривается сия очередь и удаляется в тартары все из нее. В итоге: объект будет правильно удален и можно вызвать ф-ию базового класса. PS. А выглядит действительно по уродски, поэтому и не писал так раз, а два - единый стиль надо соблюсти - вызов базового обработчика всегда в конце. PPS. Спасибо за участие! |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |