Seite 1 von 1
[gelöst] QptrList compareItems
Verfasst: 17. Juni 2005 13:38
von Carsten
Zum Gruße
Ich glaube ich sehe zZ den Wald vor lauter Bäumen nicht

.
Ich möchte die QPtrList dazu verwenden eine Pointerliste von Objekten zu verwalten. Meine Objekte müssen aber nach eine internen Länge sortiert werden.
"double MyObject[n]->Length(); " liefert den benötigten Wert zurück.
Um die Klasse QPtrList vernünftig nutzen zu können muss ich doch die Methode "virtual int compareItems( ...,...) umschreiben. Mein Problem dabei ist das ich ja nicht von dieser Klasse ableiten kann, da sie eine Template Klasse ist, oder?
Klaro kann ich auch eine eigene Methode zur Sortierung, insert, new, delete etc. schreiben aber es muss doch möglich sein eine Template Klasse in dieser Art nutzen zu können.
Verfasst: 17. Juni 2005 13:40
von lepsai
Klar kann man ableiten:
class MyPtrList : public QPtrList<MyPtrClass>
{
...
};
Verfasst: 17. Juni 2005 13:47
von Carsten
Vielen vielen dank *g*
Wie gesagt ... die Bäume

Verfasst: 20. Juni 2005 10:49
von Carsten
Hm ich habe da immer noch ein Problem :/
Code: Alles auswählen
int StiffenerPtrList::compareItems(QPtrCollection::Item item1, QPtrCollection::Item item2)
Wie soll ich dort eine vernünftige Implementierung machen? Ich bekomme doch nur zwei Adressen und kann damit nicht auf meine Objekte zugreifen.
Die PtrList besteht ja aus Pointern zu den von mir erstellten Objekten. Wenn ich nun die Methode "compareItems" überschreiben will, sind die Items doch Pointer auf meine Objekte, oder?
Liste.h
Code: Alles auswählen
#include <qptrlist.h>
#include "MyClass.h"
class MyClassPtrList : public QPtrList<MyClass>
{
public:
MyClassPtrList();
protected:
virtual int compareItems( QPtrCollection::Item, QPtrCollection::Item );
};
Die cpp
Code: Alles auswählen
#include "MyClassPtrList.h"
MyClassPtrList::MyClassPtrList()
{}
int MyClassPtrList::compareItems(QPtrCollection::Item item1, QPtrCollection::Item item2)
{
double l1= item1->Length();
double l2= item2->Length();
return 0;
}
MyClass.h
Code: Alles auswählen
#include <qobject.h>
class MyClass: public QObject
{
Q_OBJECT
public:
MyClass( QObject* parent = 0, const char* name = 0, int number=0);
MyClass(const MyClass&);
MyClass &operator = (const MyClass&);
Length();
private:
double m_length;
void calculateLength();
;
(Die Klassen sind zusammengekürzt)
Ich hatte auch versucht die Zeiger, von der compare Methode internen Zeigern zuzuweisen, aber auch das funktioniert nicht.
Die Items scheinen *void zu sein (?)
Verfasst: 20. Juni 2005 10:57
von lepsai
Probier mal:
double l1= (dynamic_cast<MyClass*>(item1))->Length();
double l2= (dynamic_cast<MyClass*>(item2))->Length();
dynamic_cast sollte man auf NULL prüfen...
Verfasst: 20. Juni 2005 10:58
von lepsai
Steh ja auch in der Doku, wie ich sehe:
A collection is implemented using the Item (generic collection item) type, which is a void*. The template classes that create the real collections cast the Item to the required type.
Verfasst: 20. Juni 2005 11:01
von Carsten
Nochmals vielen Dank lepsai
