Как правильно хранить объекты / указатели в Qlist - PullRequest
0 голосов
/ 18 мая 2018

Я новичок в Qt, и я наткнулся на эту строку:

    QList<Class*>* _lstChildren = new QList<Class*>(); 

, где класс является производным от другого класса и имеет различные конструкторы.

Мне любопытно: почему используется дополнительный * и что означает () в конце?

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Нет «лишних» *.

QList<Class*>* _lstChildren = new QList<Class*>(); 

_lstChildren - это указатель * на QList, который состоит из указателей * на Class

И () находится в конце new QList<Class*>(), потому что объект QList<Class*> инициализируется инициализацией значения .

0 голосов
/ 18 мая 2018

Ничего общего с Qt, это чистый синтаксис C ++

  • QList<Class*> - тип
  • QList<Class*>* _lstChildren - переменная, указатель на вышеупомянутый тип
  • = new QList<Class*>() - инициализация переменной-указателя новым выражением

QList является аналогом Qt std::deque, std::list (не является прямым эквивалентом того или другого), Class* является типом длябыть сохраненным переданным как параметр шаблона.

() - это часть нового выражения для инициализации указателя со значением, указывающим на созданный объект типа QList<Class*>.

В этом случае он вызывает конструктор по умолчанию - аргументы внутри скобок не указаны.Если бы у QList не было конструкторов вообще, это означало бы инициализацию значения (по нулям) созданного объекта.

Ваш список содержит необработанные указатели, поэтому вы должны дать ему указатели на Class*, например, чтобы создатьобъект в динамической памяти.

QList<Class*>* lstChildren = new QList<Class*>(); 

Class* child1= new Class();
lstChildren->append(child1);

Так получается, что QList не должен удалять объекты, на которые указывают эти указатели, он будет уничтожать только сами указатели.Для очистки необходимо использовать

qDeleteAll(*lstChildren);
lstChildren->clear();

или удалить их по отдельности (и удалить из списка).

...