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.


Anmelden zum Antworten