Hallo zusammen!
Bei mir hat sich in meinem Quelltext ein Problem eingesessen, was sich
mir nicht erschließt. Ich möchte gerne in C++ eine Klasse erstellen, die
auch vererben kann und einen Vergleichsoperator "a < b" besitzt. Diesen
habe ich wie folgt geschrieben:
Inhalt der *.h
1
classCLCObject{
2
//foo
3
public:
4
virtualbooloperator<(CLCObject&rhs);
5
6
private:
7
//bar
8
};
Inhalt der *.cpp
1
// foo
2
boolCLCObject::operator<(CLCObject&rhs){
3
// getLaps() und getLastTime() geben Variablenwerte
4
// des jeweiligen Objekts in int bzw. double zurück
5
if(this->getLaps()>=rhs.getLaps())
6
returnfalse;
7
if(this->getLastTime()<rhs.getLastTime())
8
returntrue;
9
returnfalse;
10
}
11
//bar
Wenn ich nun die Membervariablen verändere, auf die getLaps() und
getLastTime() zugreifen, sollten sich beim Vergleich die Aussagen der
Operatoren verändern können. Das tun sie leider nicht.
Eine einfache Anwendung wie
1
CLCObject*a;
2
CLCObject*b;
3
a.setLaps(int);
4
b.setLaps(anotherint);
5
if(a<b)
6
// foobar
ergibt immer den gleichen Wahrheitswert, obwohl die Werte nach
eigentlichem händischen Auslesen andere Aussagen erzeugen.
Im Debugmodus (Ich nutze Qt-Designer) habe ich einen Breakpoint in den
Operator herein geladen. Dieser wird allerdings nicht ausgeführt, so
dass ich anscheinend in den Vergleich nicht hineingerate.
Habe ich in der Implementierung etwas falsch gemacht?
Besten Dank für jegliche Antworten!
Thomas
Dein Beispiel kann nicht kompilieren, a und b sind Zeiger!
Wenn dein richtiger Code auch so aussieht, vergleichst du zwei Zeiger
und damit wird dein Operator nicht aufgerufen.
Das ist aber nur Spekulation, also, zeig mal Code!
das kann so gar nicht funktionieren.
Du erstellst zwei Zeiger, weist ihnen aber keinen Speicher zu.
BTW Operatoren erstellt man außerhalb der Klasse, damit man implizite
Typumwandlungen benutzen kann.
Ich denke, dass das mit den Zeigern nur ein Vertipper im Beitrag war.
@TO
Bitte zeige mal den kompletten Code der Klasse und ein richtiges
Beispiel, nicht Pseudocode.
Thomas schrieb:> Bei mir hat sich in meinem Quelltext ein Problem eingesessen, was sich> mir nicht erschließt. Ich möchte gerne in C++ eine Klasse erstellen, die> auch vererben kann und einen Vergleichsoperator "a < b" besitzt.
Mal abgesehen von dem, was die anderen gesagt haben: Du baust dir damit
ein multiple-dispatch-Problem, denn die Funktion, die für den Vergleich
aufgerufen werden muss, hängt vom Typ von zwei Objekten ab.
Das ging schnell!
Kurz zum Projekt selbst: ich möchte gerne einen Rundenzähler für meine
alte Carrerabahn erstellen. Dazu möchte ich gerne Membervariablen aus
meinen Objekten CLCFahrer (Subklasse von CLCObjekt) vergleichen um
Header
Man sollte sich auch immer überlegen, ob es eigentlich logisch Sinn
ergibt, einen bestimmten Operator zu überladen.
Thomas schrieb:> CLCFahrer *a = new CLCFahrer("Thomas");> CLCFahrer *b = new CLCFahrer("Dieter");
[...]
> if(*b < *a)
Kann man tatsächlich davon sprechen, daß es hier darum geht,
rauszufinden, ob das, worauf b zeigt (also der Fahrer) kleiner ist als
das, worauf a zeigt?
Es würde also heißen: "Dieter ist kleiner als Thomas".
Und warum ist der operator< virtuell. Welchen Fall möchtest du damit
abdecken?
Thomas schrieb:> if(this->getLaps() >= rhs.getLaps())> return false;> if(this->getLastTime() < rhs.getLastTime())> return true;> return false;
Und was für ein Unfug ist denn das?!
beric schrieb:> Thomas schrieb:>>> if(this->getLaps() >= rhs.getLaps())>> return false;>> if(this->getLastTime() < rhs.getLastTime())>> return true;>> return false;>> Und was für ein Unfug ist denn das?!return this->getLastTIme() <> rhs.getLastTime();> reicht volkommen aus.
Äh, vergiss es. Habe meine Brille nicht auf und getLaps() auch als
getLastTime() gelesen. 'schuldigung.