2014-01-14 8 views
3

Я пытаюсь создать класс, представляющий коллекцию (или несколько) производного класса QObject (со своими собственными свойствами qt). Свойства qt, которые я могу использовать в qml.Каков правильный способ для объекта иметь коллекцию производного класса QObject?

Согласно http://qt-project.org/doc/qt-5.0/qtcore/qobject.html#no-copy-constructor-or-assignment-operator qt не очень хорошо работает с конструкторами копирования.

Поэтому я использовал QList<QObject derived class> (моя первая идея). Я не могу передать список по ссылке (или, по крайней мере, я думаю, что это означает ошибки компилятора) (требуется копирование) к списку.

Должен ли я использовать QList<QObject derived class *> или QList<SomeQTSmartPointer<QObject derived class>> или что-то еще?

ответ

2

Должен ли я использовать QList<QObject derived class *> или QList<SomeQTSmartPointer<QObject derived class>> или что-то еще?

Оба они в порядке, но лучше придерживаться первого через механизм родительского/дочернего Qt в целом. Это будет самый Qt'ish способ управления ею в целом:

QList<MyClass*> list; 
list.append(new MyClass(parent); 

Вы также можете использовать Qt смарт-указатели, как QPointer, QScopedPointer или QSharedPointer следующим образом:

QList<QShardPointer<MyClass> > list; 
// Being explicit to be more comprehensive, but it is not necessary 
list.append(QSharedPointer<MyClass>(new MyClass()); 

Это будет работать с обоими pre C++ 11 и post.

+0

Просто убедитесь, что вы не используете QSharedPointer (новый MyClass (родительский)), или вы получите двойное удаление. –

2

Хорошо, оба QList<Derived*> и QList<std::unique_ptr<Derived>> сделаю. Если вы используете Qt мусора по умолчанию коллектор (с родитель-ребенок дерево), вы можете просто использовать:

QList<Derived*> list; 
list.push_back(new Other(parent, ...)); 

в противном случае вы должны использовать второй:

QList<std::unique_ptr<Derived>> list; 
list.push_back(new Other(...)); 
+0

Также можно использовать 'QList >'. –

+0

«Следует отметить, что в первом случае он должен читать новый« Другой »(родительский)» -> Не обязательно. Это зависит от определения конструктора производного класса. «Можно также использовать QList >» -> Да, а также QSharedPointer, QPointer и т. Д. – lpapp

+0

Джеффри, я беспокоюсь, что с вашим ответом он сформирован по отношению к C++ 11 (уникальный указатель, push назад, а не append, и >>, тоже, без пробела), в отличие от решения Qt для pre C++ 11 и post, где должен работать Qt. Я не буду ниспровергать, потому что я думаю, что оба могут быть полезны для читателей. Надеюсь, ты не возражаешь против моего ответа. :) – lpapp