[gelöst] QptrList compareItems

Alles rund um die Programmierung mit Qt
Antworten
Carsten
Beiträge: 11
Registriert: 20. Oktober 2004 14:49

[gelöst] QptrList compareItems

Beitrag 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.
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

Klar kann man ableiten:

class MyPtrList : public QPtrList<MyPtrClass>
{
...
};
Carsten
Beiträge: 11
Registriert: 20. Oktober 2004 14:49

Beitrag von Carsten »

Vielen vielen dank *g*

Wie gesagt ... die Bäume ;)
Carsten
Beiträge: 11
Registriert: 20. Oktober 2004 14:49

Beitrag 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 (?)
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag 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...
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag 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.
Carsten
Beiträge: 11
Registriert: 20. Oktober 2004 14:49

Beitrag von Carsten »

Nochmals vielen Dank lepsai :D
Antworten