Russian Qt Forum
Ноябрь 26, 2024, 09:50 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Неявное удаление объкта  (Прочитано 2726 раз)
Rain
Гость
« : Февраль 19, 2009, 23:52 »

Цитировать
QObjects organize themselves in object trees. When you create a QObject with another object as parent, the object will automatically add itself to the parent's children() list. The parent takes ownership of the object i.e. it will automatically delete its children in its destructor.
Какой-то внутренний конфликт возникает при чтении этих строк.

Есть у меня в классе набор указателей на "обычные" объекты и набор указателей на потомков QObject. Нужно заботится об удалении "обычных" в деструкторах, или же каждого использовать в контексте смарт-поинтера. С другой стороны, с указателями на QObject-ы получается обратная ситуация, нужно следить чтобы никто из них случайно не попал в деструктор и не удалился неположенным образом(оно может быть вреда и не будет, внутрях всеравно наверняка используются QPointer'ы, но зачем на лишние действия?).

Не лучше ли было сделать нормальный QSmartPointer какой-нибудь и не городить огород с неявным удалением чайлдов?


Записан
Dendy
Гость
« Ответ #1 : Февраль 20, 2009, 00:22 »

Естественно нужно следить, чтобы не удалился один раз из деструктора родителя, а второй раз отукда-то ещё. Точно так же, как следить за тем, чтобы не удалить простой указатель несколько раз. Случайностей не бывает, логика достаточно чёткая. У обьекта может быть один и только один родитель, который автоматически удалит его в собственном деструкторе. Если обьект удалится раньше по другой причине - он уберётся из списка дочерних обьектов и деструтор второй раз вызван не будет. Другими словами - можете спокойно удалять детей в деструкторе, более того иногда это необходимо, чтобы вызвать цепочку деструкторов в нужной последовательности, а не в случайном порядке, как это сделает ~QObject().

QPointer не удаляет обьекты. Этот класс нужен только для "хаков", программировать им не стоит - рискуете сломать процедурный стиль программирования, а, следовательно, запутать логику программы.

Цитировать
Не лучше ли было сделать нормальный QSmartPointer какой-нибудь и не городить огород с неявным удалением чайлдов?

Для этого нужно хранить экземпляры QSmartPointer в классе, что не всегда возможно. Хотя бы потому что обьекты могут "клеиться" к другим обьектам на лету.
Записан
Rain
Гость
« Ответ #2 : Февраль 20, 2009, 00:43 »

более того иногда это необходимо, чтобы вызвать цепочку деструкторов в нужной последовательности, а не в случайном порядке, как это сделает ~QObject().
Это все так. Но как-то много получается возможных точек выхода. Если например придется работать со старым(да еще и чужим) кодом, то попробуй разбери где, что, как, зачем и когда удаляется.


QPointer не удаляет обьекты.
Да, это я уже уяснил, спасибо.

Цитировать
Не лучше ли было сделать нормальный QSmartPointer какой-нибудь и не городить огород с неявным удалением чайлдов?
Для этого нужно хранить экземпляры QSmartPointer в классе, что не всегда возможно. Хотя бы потому что обьекты могут "клеиться" к другим обьектам на лету.

Фраза "на лету" сильно не в стиле С++ на мой взгляд:-) Я бы в предпочел инкапсулировать в объекте некоторые данные и реализовать соответствующую функциональность, чем лепить что-то из вне. В случае С++ :-)
« Последнее редактирование: Февраль 20, 2009, 00:49 от Rain » Записан
Dendy
Гость
« Ответ #3 : Февраль 20, 2009, 01:16 »

Если честно не знаю чем вас смутил C++, это всего лишь инструмент. Как видите - с помощью него можно достаточно просто создать обьектную модель, из которой на лету можно конструировать гирлянду обьектов. Инкапсуляция - это хорошо, но иногда вы получаете уже готовый экземпляр обьекта, к которому нужно что-то приклеить сбоку. Например, переопределить некоторые события, приклеив обьект с фильтром событий, который уничтожится вместе с хозяином.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.143 секунд. Запросов: 21.