Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> паттерн composite, decorator удаляет детей? кто за это отвечает 
V
    Опции темы
asmdzen
Дата 2.8.2011, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



в общем имеется родительский объект который содержит несколько указателей на дочерние объекты, или как в декораторе только один указатель на объект которого декорируем, конструктор вызывается так (для декоратора):
Код

VisualComponent* component = new BorderDecorator( new ScrollDecorator(new TextView));

значит ли это что деструктор декоратора уничтожит и объект которого декорирует?
если так то как можно это обойти?

в composite та же история, делаю несколько объектов, вызываю AddChild(), но после этого я теряю все внешние указатели, т.е. только родитель для которого AddChild вызывался и знает об этих объектах, значит ли это что он ответственен за их удаление?

как присобачить сюда shared_ptr?
PM MAIL   Вверх
bsa
Дата 2.8.2011, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



правило простое - кто память выделил, тот ее и освобождает.
shared_ptr втыкать необходимо вместо обычных указателей:
Код
BorderDecorator(const boost::shared_ptr<ScrollDecorator> d);
Естественно, твоя страшная строка станет еще страшней.
Но, думаю, проблема не в строке, а в архитектуре. Рекомендую ознакомиться с подходом примененном в Qt - там достаточно грамотно все придумано.
PM   Вверх
asmdzen
Дата 2.8.2011, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



Цитата(bsa @  2.8.2011,  17:53 Найти цитируемый пост)
кто память выделил, тот ее и освобождает.

за это спасибо, я не знал.
а вот в QT куда именно смотреть? я с ним абсолютно не знаком.

Добавлено через 6 минут и 36 секунд
Цитата(bsa @  2.8.2011,  17:53 Найти цитируемый пост)
твоя страшная строка станет еще страшней.

я вообще то никогда так не делаю, т.е. new в параметрах функции ) это пример из "Design Patterns - Gang of four"
тогда получается что с shared_ptr будет правильно? например если это результат от factory?
PM MAIL   Вверх
spyswamp
Дата 3.8.2011, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 349
Регистрация: 18.8.2006

Репутация: 1
Всего: 7



asmdzen, читани http://rsdn.ru/article/cpp/smartptr.xml?print
Хорошо написано про смарт поинтеры, возможно, тебе shared_ptr и не понадобится.


--------------------
- why you call it beta?
- cuz it's betta then nothin'
PM MAIL   Вверх
bsa
Дата 3.8.2011, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(asmdzen @  2.8.2011,  18:00 Найти цитируемый пост)
а вот в QT куда именно смотреть? я с ним абсолютно не знаком.

QT != Qt, QT == QuickTime

Смотреть надо в самоучители (tutorials). Ты можешь сделать один объект владельцем другого. При уничтожении, владелец убивает все вложенные. Но если уничтожается вложенный раньше владельца, то факт владения отменяется. Таким образом код:
Код
{
   QWidget parent;
   QWidget child(&parent); //child лежит внутри parent
}
Совершенно корректно отработает, так как при уничтожении child снимет регистрацию в списке parent. Поэтому деструктор parent'а уже не будет никого убивать.

PM   Вверх
asmdzen
Дата 3.8.2011, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



spyswamp, спасибо, просвятился )
поставлю shared_ptr в этих объектах и пускай если нет больше указателей на их детей (как они вообще называются, в смысле child??) то они сами удаляют их в деструкторе.
bsa опять рассинхрон, это отличная идея )) то что нужно для composit'ов, спасибо!

в общем всем спасибо, вопрос закрываю.

Это сообщение отредактировал(а) asmdzen - 3.8.2011, 12:41
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0464 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.