operatoren < und > überladen
-
tach auch.
ich wollte mal zur übung versuchen die vergleichsoperatoren < und > zu überladen
für meine klasse "Rectangle".rectangle.h:
class Rectangle { private: double length; double width; double area; public: Rectangle(); Rectangle(double lgth, double wdth) {computeArea();}; Rectangle(double ar); ~Rectangle(); void computeArea(); bool operator>(Rectangle& rectangle); bool operator<(Rectangle& rectangle); };so sind die beiden operatorfunktionen in rectangle.cpp definiert:
bool Rectangle::operator>(Rectangle& rectangle) { if (area > rectangle.area) return true; else return false; } bool Rectangle::operator<(Rectangle& rectangle) { if (area < rectangle.area) return true; else return false; }in der main.cpp wollte ich das ganze so testen:
Rectangle rctOne(2.9, 3.8); Rectangle rctTwo(3.4); if (rctOne < rctTwo) { std::cout << "rctOne ist groesser als rctTwo."; } else { std::cout << "rctOne ist kleiner als rctTwo."; }Problem: wenn ich im "if()" schreibe rctOne < rctTwo, wird die untere Meldung
ausgegeben, wenn ich schreibe rctOne > rctTwo die obere Meldung.
Die Flächen werden also gar nicht verglichen...wieso? was mache ich falsch?
wäre dankbar um hilfe
cu
-
Dave_R schrieb:
bool Rectangle::operator>(Rectangle& rectangle) { if (area > rectangle.area) return true; else return false; }Die Funktion operator> sollte besser eine andere Signatur haben:
bool Rectangle::operator>(const Rectangle& rectangle) const;Die beiden consts sind wichtig, sonst wird es schwer deinen operator> zu verwenden.
Haeufig schreibt man sowas auch als globale friend-Funktion, aber das macht hier praktisch keinen (gewollten) Unterschied.
Uebrigens ist area > rectangle.area bereits ein Ausdruck vom Typ bool, da ist ein zusaetzliches if sehr umstaendlich. Du kannst direkt schreiben:
bool Rectangle::operator>(const Rectangle& rectangle) const { return area > rectangle.area; }Dave_R schrieb:
if (rctOne < rctTwo) { std::cout << "rctOne ist groesser als rctTwo."; } else { std::cout << "rctOne ist kleiner als rctTwo."; }Deine cout-Ausgaben passen nicht zur if-Bedingung, vielleicht hast du dich nur vertan?
Ansonsten wird die Flaeche nicht korrekt berechnet. Zum Beispiel ignoriert der Konstruktor Rectangle::Rectangle(double lgth, double wdth) seine beiden Parameter, das kann nicht gutgehen.
-
naja was soll ich sagen:es ist wohl keine sehr gute idee, morgens um 2 mit rasenden kopfschmerzen programmieren zu wollen....das alles hätte mir eigentlich selbst auffallen müssen...trotzdem danke.