Название: Удаление объекта из списков QList, QSet...при вызове деструктора объекта Отправлено: ltise от Август 12, 2010, 12:24 Привет всем!
Чета заморочился, не могу найти подходящего решения... Есть некий объект Т (от QObject), УКАЗАТЕЛЬ на объект одновременно находится в разных списках QList, QSet и т.п. необходимо при удалении объекта, удалять указатель на него из всех списков, автоматически. я решил использовать сигнал destroyed(QObject*object), и создать свои классы List, Set, где при добавлении подписывать список на сигнал объекта destroyed(....) типа: Код: template <typename T> Но! Qt пишет, что не может использовать Q_OBJECT в классах-шаблонах... что делать, может есть другое решение ? Название: Re: Удаление объекта из списков QList, QSet...при вызове деструктора объекта Отправлено: Igors от Август 12, 2010, 12:51 Есть смысл хранить в QList не сами объекты, а указатели на них. Напр. есть 2 или более QList. с указателями на одни и те же объекты. Тогда нормально удалять указатели из того или иного списка. А если бы Вам даже и удалось хранить сами объекты - то это были бы копии/'экземпляры объектов (никак не связанные друг с другом) т.е. "разные объекты" а не "те же в разных списках"
Название: Re: Удаление объекта из списков QList, QSet...при вызове деструктора объекта Отправлено: ltise от Август 12, 2010, 13:05 Есть смысл хранить в QList не сами объекты, а указатели на них. Напр. есть 2 или более QList. с указателями на одни и те же объекты. Тогда нормально удалять указатели из того или иного списка. А если бы Вам даже и удалось хранить сами объекты - то это были бы копии/'экземпляры объектов (никак не связанные друг с другом) т.е. "разные объекты" а не "те же в разных списках" Сорри, я имел ввиду указатели: Код: List<MyPoint*> list; Название: Re: Удаление объекта из списков QList, QSet...при вызове деструктора объекта Отправлено: crossly от Август 12, 2010, 13:53 ну так если указатель один... в разных списках... то если удалить указатель то перестанет существовать во всех...
Название: Re: Удаление объекта из списков QList, QSet...при вызове деструктора объекта Отправлено: Igors от Август 12, 2010, 15:55 Ну и делайте QList указателей
Код: template <class T> Название: Re: Удаление объекта из списков QList, QSet...при вызове деструктора объекта Отправлено: ltise от Август 12, 2010, 16:07 Ну и делайте QList указателей Заморочка в том, что не могу использовать connect(...), потому-что если вставляю в класс Q_OBJECT компилятор посылает: Error: Template classes not supported by Q_OBJECT Название: Re: Удаление объекта из списков QList, QSet...при вызове деструктора объекта Отправлено: ltise от Август 12, 2010, 16:18 ну так если указатель один... в разных списках... то если удалить указатель то перестанет существовать во всех... Код: QList<MyObject *> list; Название: Re: Удаление объекта из списков QList, QSet...при вызове деструктора объекта Отправлено: whirlwind от Август 12, 2010, 17:32 Но! Qt пишет, что не может использовать Q_OBJECT в классах-шаблонах... QList не является наследником QObject, поэтому в нем не может быть слотов и сигналовчто делать, может есть другое решение ? попробуйте просто создать класс, который будет жить вместе со списком и обновлять его при необходимости типа Код: class DestroyProcessor : public QObject не уверен, что оно скомпилится, просто для демонстрации идеи Название: Re: Удаление объекта из списков QList, QSet...при вызове деструктора объекта Отправлено: ltise от Август 12, 2010, 18:02 Но! Qt пишет, что не может использовать Q_OBJECT в классах-шаблонах... QList не является наследником QObject, поэтому в нем не может быть слотов и сигналовчто делать, может есть другое решение ? попробуйте просто создать класс, который будет жить вместе со списком и обновлять его при необходимости типа Код: class DestroyProcessor : public QObject не уверен, что оно скомпилится, просто для демонстрации идеи Уже пробовал.. тут затык в передаче параметра в setList.. void setList(QList<QObject*>* list) типа: error: no matching function for call to 'Test::setList(QList<MyObject*>*)' Название: Re: Удаление объекта из списков QList, QSet...при вызове деструктора объекта Отправлено: Marat(Qt) от Август 12, 2010, 20:22 А зачем делать QList<MyObject*>, если MyObject все равно от QObject наследуется, можно делать QList<QObject*> и использовать cast'ы. не айс конечно, но на безрыбье..
Название: Re: Удаление объекта из списков QList, QSet...при вызове деструктора объекта Отправлено: Igors от Август 12, 2010, 22:08 Мда, идея нормальная/естественная, а вот получается как-то сложновато. Замечание что QList не может принять сигнал абсолютно верно. Может лучше пусть объект хранит в себе все указатели на QList в которые он входит и в деструкторе вычеркивает себя из всех списков?
Название: Re: Удаление объекта из списков QList, QSet...при вызове деструктора объекта Отправлено: ltise от Август 12, 2010, 22:49 Мда, идея нормальная/естественная, а вот получается как-то сложновато. Замечание что QList не может принять сигнал абсолютно верно. Может лучше пусть объект хранит в себе все указатели на QList в которые он входит и в деструкторе вычеркивает себя из всех списков? Тут тоже грабли везде.. объект должен знать о удалении списка, о удалении себя из списка..надо попробовать... Название: Re: Удаление объекта из списков QList, QSet...при вызове деструктора объекта Отправлено: ltise от Август 13, 2010, 00:04 Вобщем через свой листенер получилось:
Код:
ТЕСТ: Код: QTime timer; Название: Re: Удаление объекта из списков QList, QSet...при вызове деструктора объекта Отправлено: SABROG от Август 13, 2010, 00:51 Можно было сделать через QWeakPointer. Его всегда можно проверить на валидность, если речь идет об указателях на QObject'ы, и удалять не валидный, если он не нужен в списке.
Название: Re: Удаление объекта из списков QList, QSet...при вызове деструктора объекта Отправлено: ltise от Август 13, 2010, 06:33 Можно было сделать через QWeakPointer. Его всегда можно проверить на валидность, если речь идет об указателях на QObject'ы, и удалять не валидный, если он не нужен в списке. Тут сразу встает вопрос, куда воткнуть проверку на валидность ? В общем случае напрягает обращение через QWeakPointer::data().... Название: Re: Удаление объекта из списков QList, QSet...при вызове деструктора объекта Отправлено: Waryable от Август 16, 2010, 06:11 Конечно, не верх изящества но...
В деструкторе объекта удаляй указатель из списка. Кривость тут в том, что объект должен знать, где он хранится... Для этого можно использовать список указателей на те контейнеры, в которых хранится указатель на объект. Т.о, пробегаешь по данному списку и вроде бы все удалится. PS: Поправьте если где-то не заметил грабли. |