2014-12-17 19 views
6

Ich brauche einen Pointer-Container, der die Besitzer der Zeiger übernimmt - d. H. Wenn ein Element entfernt wird oder der Container den Gültigkeitsbereich verlässt, gibt es alle seine Zeiger frei, wie in boost::ptr_vector.Qt entspricht boost :: ptr_vector?

QList<QScopedPointer<AbstractClass> > funktioniert nicht (Fehler kompilieren, kein Kopierkonstruktor?).

Momentan verwende ich QList<QSharedPointer<AbstractClass> >, aber es fühlt sich an wie ein Overkill, mit seiner Referenzzählung und dem teuren Mutex für Multithreading.

Edit: Ich habe gelernt, über QPtrList (dank @ForEveR), das war, dass sehr gleichwertig in Qt3, wurde aber von späteren Versionen entfernt. Ich verstehe einfach nicht, warum sie es entfernen würden.

+0

Wow, interessante Frage, aber yeah, QScopedPointer ist nicht dazu gedacht, kopiert zu werden, da das einzelne Eigentum hält. – lpapp

+0

Sind Sie mit einer C++ 11-Lösung zufrieden oder müssen Sie vorher auch den Standard unterstützen? unique_ptr kann zumindest in einen std :: vector eingefügt werden. QVector ist schwieriger. – lpapp

+0

@lpapp Ich bin auf VS2010 für dieses Projekt, so kann ich C++ 11 nicht persönlich verwenden. – sashoalm

Antwort

4

Sie haben Recht, dass QSharedPointer aus diesen Gründen ein wenig Overhead ist.

Leider gibt es in Qt keinen solchen Zeigervektor, und es ist auch fraglich, ob es sich lohnt, etwas hinzuzufügen, wenn sich die Sprache weiterentwickelt, und wir haben gute Primitive für ähnliche Aufgaben.

Ich habe nur eine kurze Diskussion mit einem der Kernentwickler Qt und es scheint zu sein, dass die empfohlene Lösung für heute entweder QSharedPointer ist oder diese von C++ 11:

std::vector<std::unique_ptr<AbstractClass>> 

nicht Versteh versuchte QVector anstelle von std :: vector zu verwenden, da QVector möglicherweise Kopien erstellen möchte.

Sie durch diese Lösung auch nicht, auch in C++ 11 versucht erhalten:

QList<QScopedPointer<AbstractClass>> 

Das hier Problem ist, dass QList Kopien tun will. Wenn Sie eine nicht-const-Methode verwenden, wird detach aufgerufen, die Kopien erstellt und nicht Compiler.

Außerdem hat QScopedPointer keine Move-Konstruktoren oder Operatoren und that is by design.

0

Nur eine weitere Idee basiert auf Qt-Konzepte:

Sie die Objekte ableiten kann, die der Zeiger in der Liste von QObject zeigt und eine kleine QObect-basierte Klasse hinzufügen, die das Eigentum für die Liste hält. Jeder Zeiger, der dieser neuen QObject-basierten Liste hinzugefügt wird, muss die besitzende Listenklasse als übergeordnete Klasse festlegen. Der QObject-basierte Listencontainer kümmert sich nun beim Release um die Bereinigung mit dem Qt-Mechanismus.

class Ptr : public QObject { 
}; 

class MyList : public QObject { 
    QList<Ptr> m_myList; 

public: 
    void add(Ptr *item) { 
     m_mylist.push_back(item); 
     item->setParent(this); 
    } 
}; 

Sie können mehr über den Objektbaum Besitz von Qt finden Sie hier: http://qt-project.org/doc/qt-4.8/objecttrees.html.

Natürlich ist dies viel mehr Aufwand als mit einem kleinen C++ - 11 Typ wie std :: unique_ptr.

+0

Interessanter Trick, aber Sie lassen den größten Teil der Liste Funktionalität auf diese Weise, so z.Sie können dies nicht verwenden, wenn Sie normale Behälter verwenden können. Sie brauchen wahrscheinlich einen Getter auf die "echte" Liste, aber dann haben Sie das Problem der Wiedergutmachung; hmm, es ist nicht trivial :) – lpapp

+0

YOu hast Recht, das ist der Reasone Ich habe dies nur als eine Idee markiert, um die Qt-Base-Zeug zu verwenden. Ich denke viel zu viel Aufwand für eine kleine Liste mit Zeigern. – KimKulling

+0

Meine Grammatik wurde korrigiert. – KimKulling