Seite 1 von 1

Zeigerlisten-Klasse

Verfasst: 31. August 2006 20:05
von FaS
Ich hatte früher meine eigenen Array-Klassen benutzt, seit ich Qt verwende (v4) bevorzuge ich eigentlich seine Listenklassen, zumindest würde ich es gerne. Aber in einem Punkt gefallen die mir überhaupt nicht:

Beispiel: QList<MeineKlasse>. Jedes Element wird als Zeiger gespeichert, warum gibt es dann verdammt nochmal nicht die Möglichkeit existierende Objekte in die Liste zu übernehmen ohne sie zu kopieren. Denn es kommt durchaus vor, dass ich temporäre Teillisten benötige, welche natürlich nur Zeiger auf entsprechend vorhandene Elemente der anderen Liste sein sollten. Und außerdem ist es so nicht möglich, Klassen mit nicht-default-Konstruktoren einzufügen ohne sie erst zu erstellen und dein eine Kopie einzufügen (meine Klassen haben sowieso keine copy constructors).
Wenn ich QList<MeineKlasse*> benutzte wäre das erstens Ressourcenverschwendung (doppelte Zeiger) und zweitens könnte ich nicht QList::clear() aufrufen ohne jedes Element vorher einzeln zu deleten, genauso bei QList::removeLast usw. Desweiteren gibt es kein QList::resize(), was mich stört.
QVector<MeineKlasse*> funktioniert nicht, wahrscheinlich muss ich den Typ dan bei Qt registrieren oder so (mir wird schlecht..). Mein Compiler meldet dann nämlich sowas: "error: aggregate `QVector<MeineKlasse*> meineKlasse' has incomplete type and cannot be defined".

Also was ist nun die optimale Lösung um Zeigerlisten zu verwalten?.

Verfasst: 31. August 2006 20:16
von Christian81
Und was ist gegen QList<MeineKlasse*> einzuwenden?

Verfasst: 31. August 2006 20:54
von FaS
Wie gesagt, man kann damit nicht sehr schön hantieren. Und da so gut wie jeder Liste die ich brauche oben beschriebene Funktionalitäten aufweisen müssen, müsste ich auch für (fast) normale Listen immer QList<MeineKlasse*> verwenden und damit müsste jeder Aufruf von QList::removeLast(), QList::clear() usw. von Schleifendurchläufen begleitet werden, die vorher die Elemente auf die die Zeiger zeigen deleten.
Ich bin ja quasi schon darauf angewiesen wenn ich die Elemente "bloß" mit nicht-default-Konstruktoren erstellen möchte.
Ich müsste also eine Menge Code schreiben, überall wo etwas mit der Liste gemacht wird, nur weil ich Qt-Listen benutzen will. Und meine eigenen Listenklassen wären außerdem sehr viel schneller und weniger Speicherlastig. Beide Nachteile zusammen würde ich gerne verhindern.

Mfg, FaS

Verfasst: 31. August 2006 20:57
von Christian81
FaS hat geschrieben:...und damit müsste jeder Aufruf von QList::removeLast(), QList::clear() usw. von Schleifendurchläufen begleitet werden, die vorher die Elemente auf die die Zeiger zeigen deleten.
für clear() gibt qDeleteAll()
und wenn ich anstatt QList::removeLast()' einfach 'delete QList::takeLast ()' nehme ist das auch gegessen.

Verfasst: 31. August 2006 21:38
von FaS
Danke für die Hinweise Christian81! Damit kann ich erstmal leben denke ich. Wenn man einmal eine extrem auf Performance getrimmte Zeigerlistenklasse erstellt hat, die zudem trotzdem recht benutzerfreundlich ist, ist es schwer sich davon zu trennen. Aber QList ist irgendwie etwas bequemer, und überall verstreut Listenklassen von verschiedenen Toolkits mit unterschiedlicher Syntax zu benutzen finde ich blöd.
Also dann,
Mfg, FaS