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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Наследование QList  (Прочитано 4827 раз)
billygates
Гость
« : Январь 27, 2010, 09:32 »

Знаю, что в рекоммендациях троллей отдельно подчеркивается, что не стоит наследоваться от системных типов. Но хочется свести менеджмент памяти к минимуму: хочется вместо
Код
C
QList<MyClass *> list_of_classes;
...
qDeleteAll(list_of_classes);
 
чтобы элементы списка удалялись автоматически по выходу за scope. Здесь два варианта: либо умные указатели, либо наследование от QList с реализацией деструктора, удаляющего все указатели. Насколько распространен и правилен второй вариант? Спасибо.

p.s. Да, я знаю, что у QList невиртуальный деструктор.
Записан
niXman
Гость
« Ответ #1 : Январь 27, 2010, 09:35 »

а QList<>::clear() чем не угодил?
Записан
billygates
Гость
« Ответ #2 : Январь 27, 2010, 09:41 »

а QList<>::clear() чем не угодил?
Цитировать
чтобы элементы списка удалялись автоматически по выходу за scope.

cliear() и так выполнится при вызове деструктора списка. Но только не освободит память из под них, обратите внимание, что у меня в списке содержатся указатели.
Записан
BRE
Гость
« Ответ #3 : Январь 27, 2010, 09:46 »

А ты поищи по исходникам Qt строку: "public QList<"  Улыбающийся

Записан
niXman
Гость
« Ответ #4 : Январь 27, 2010, 09:50 »

Цитировать
cliear() и так выполнится при вызове деструктора списка. Но только не освободит память из под них, обратите внимание, что у меня в списке содержатся указатели.
это не является стандартным поведением. а что вы будите делать если в свой вариант контейнера захотите помещать не указатели?
Записан
billygates
Гость
« Ответ #5 : Январь 27, 2010, 10:04 »

Цитировать
cliear() и так выполнится при вызове деструктора списка. Но только не освободит память из под них, обратите внимание, что у меня в списке содержатся указатели.
это не является стандартным поведением. а что вы будите делать если в свой вариант контейнера захотите помещать не указатели?
Контейнер исключительно для указателей на один конкретный неполиморфный тип. Собственно, ответ найден:
А ты поищи по исходникам Qt строку: "public QList<"
Ой! А они вравду сами этим пользуются Улыбающийся.

Вопрос закрыт. Всем спасибо за помощь!
Записан
Akaiten
Гость
« Ответ #6 : Январь 27, 2010, 10:24 »

Цитировать
cliear() и так выполнится при вызове деструктора списка. Но только не освободит память из под них, обратите внимание, что у меня в списке содержатся указатели.
это не является стандартным поведением. а что вы будите делать если в свой вариант контейнера захотите помещать не указатели?

Он то как раз и сделать класс для хранения указателей. К тому же можно добавить свойство типа ownObjects. Если оно установлено, то указатели автоматически уничтожаются при разрушении списка.

p.s. Да, я знаю, что у QList невиртуальный деструктор.
Можно написать обёртку вокруг QList<MyClass *>

Использовать умные указатели, например, Qt-шные или какой-нибудь другой, легковесный

Добавлено 11:04
В принципе то что деструктор не виртуальный пофиг, если вы не будете удалять ваш класс через указатель на QList<T>, например:
Код
C++ (Qt)
class MyList: public QList<MyObject *>
{
 ...
};
 
QList<MyObject *> *p = new MyList();
delete p;  // ошибка, т.к. деструктор не виртуальный будет вызван только ~QList<MyObject *>
 
MyList *p2 = new MyList();
delete p2;  // так правильно, будет вызван сначала ~MyList(), а потом ~List<MyObject *>
 
MyList p3;  // тоже правильно
 
« Последнее редактирование: Январь 27, 2010, 11:10 от Akaiten » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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