Seite 1 von 1

QList<eigene_Klasse> sortieren -> Compilerfehler

Verfasst: 17. Juli 2007 00:13
von qmaddin
Hallo!

Ich möchte eine QList<Number> sortieren lassen. Ich habe eine Klasse, die unter anderem einen QString enthält.

Code: Alles auswählen

class Number
{
public:
	Number(QString &);
	const QString getNumber() {return myNumber;}
	
	const bool operator==(Number);
	const bool operator<(Number);

private:
	QString myNumber;
};

Code: Alles auswählen

#include "number.h"

Number::Number(QString &number):
	myNumber(number)
{}

const bool Number::operator==(Number rhs)
{
	return (getNumber() == rhs.getNumber());
}

const bool Number::operator<(Number rhs)
{
	return (getNumberI() < rhs.getNumberI());
}
Das kompiliert soweit. Rufe ich nun aber in einer anderen Klasse für eine QList<Number> result; folgendes auf qSort(result.begin(), result.end()); , dann kompiliert es nicht mehr:

Code: Alles auswählen

/usr/include/qt4/QtCore/qalgorithms.h: In member function »bool qLess<T>::operator()(const T&, const T&) const [with T =Number]«:
/usr/include/qt4/QtCore/qalgorithms.h:357:   instantiated from »void QAlgorithmsPrivate::qSortHelper(RandomAccessIterator, RandomAccessIterator, const T&, LessThan) [with RandomAccessIterator = QList<Number>::iterator, T = Number, LessThan = qLess<Number>]«
/usr/include/qt4/QtCore/qalgorithms.h:401:   instantiated from »void QAlgorithmsPrivate::qSortHelper(RandomAccessIterator, RandomAccessIterator, const T&) [with RandomAccessIterator = QList<Number>::iterator, T = Number]«
/usr/include/qt4/QtCore/qalgorithms.h:175:   instantiated from »void qSort(RandomAccessIterator, RandomAccessIterator) [with RandomAccessIterator = QList<Number>::iterator]«
fileaccess.cpp:109:   instantiated from here
/usr/include/qt4/QtCore/qalgorithms.h:156: Fehler: Die Übergabe von »const Number« als »this«-Argument von »const bool Number::operator<(Number)« streicht Qualifizierer
make: *** [otherclass.o] Fehler 1
Der Fehler deutet vermutlich auf eine const-Verletzung hin. Leider sehe ich keine.

Mir ist es ja egal, wie die QList<Number> sortiert wird, aber sie soll am Ende einfach nur sortiert sein! :-)

Danke schonmal!
QMaddin

Verfasst: 17. Juli 2007 06:33
von Christian81

Code: Alles auswählen

   Number(QString &);
   const QString getNumber() {return myNumber;}

   const bool operator==(Number);
   const bool operator<(Number);
Das ist irgendwie sinnlos - ein const bool zurückzugeben. Wolltest Du ggf.

Code: Alles auswählen

   Number(const QString &);
   QString getNumber() const{return myNumber;}
   bool operator==(Number) const;
   bool operator<(Number) const;
schreiben?

Verfasst: 17. Juli 2007 10:17
von qmaddin
Ok, mit deinen Änderungen (und denm zugehörigen Änderungen der Memberfunktionen) funktionierts.
Kannst du mir sagen, was der Unterschied zwischen dem const vorne und hinten ist, bz.w auf eine taugliche Doku verweisen?

Danke,
QMaddin

Verfasst: 17. Juli 2007 10:20
von Christian81
Ist eigentlich C++ Basics... naja :)

das const bezieht sich immer auf das 'element' bei dem es steht. vorn ist der Rückgabewert, also bezieht es sich auf den Rückgabewert. bis hinten bezieht es sich auf die komplette Funktion.

Mir ist gerade aufgefallen, dass

Code: Alles auswählen

bool operator==(const Number&) const;
bool operator<(const Number&) const; 
Noch besser wäre.

Verfasst: 17. Juli 2007 10:32
von NoobSaibot
ein const methode sagt aus, daß es interne daten dieser instanz nicht verändert.

Verfasst: 17. Juli 2007 10:34
von qmaddin
Ich habe zwar ein gewisses theoretisches Wissen über C++, aber einfach zu wenig Programmierpraxis... :?

Ich habe gerade deinen Verbesserungsvorschlag noch mit eingebaut.
Lass mich raten: Es wird ein Objekt übergeben, das nicht verändert werden darf und das nicht kopiert wird, sondern es wird eine Referenz übergeben...

Martin

Verfasst: 17. Juli 2007 10:46
von Christian81
richtig