Operator "<" overloading



  • Servus,

    ich hab eine eigene Klasse Datum ("Date") geschrieben und dafür den "<" (kleiner) Operator überladen... Sieht so aus:

    bool Date::operator< (const Date& d2) const{
    		if(this->year != d2.year){
    			return this->year < d2.year ? true : false;
    		}
    		else if(this->mon != d2.mon){
    			return this->mon < d2.mon ? true : false;
    		}
    		else if(this->day != d2.day){
    			return this->day < d2.day ? true : false;
    		}
    		else if(this->hour != d2.hour){
    			return this->hour < d2.hour ? true : false;
    		}
    		else if(this->min != d2.min){
    			return this->min < d2.min ? true : false;
    		}
    		else if(this->sec != d2.sec){
    			return this->sec < d2.sec ? true : false;
    		}else{ /*markierung*/
    			return false;
    		}
    	}
    

    Doch beim Aufruf:

    while(*begin < *end){
    

    Springt er direkt aus der Schleife heraus, obwohl *begin kleiner als *end IST. (hab's mir auch ausgeben lassen, es ist kleiner!)
    Ich rufe das ganze übrigens bewusst mit Pointern auf (damit er das ganze Zeug nicht immer kopiert ;))

    Mit dem Debugger habe ich herausgefunden, dass er immer bis zum else geht (/*markierung*/).
    Aber warum funktionieren die Vergleiche nicht? (alle Werte sind unsigned short, nur year ist unsigned long)

    Vielen Dank für Hilfe 🙂



  • Hi,

    poste doch mal ein ausführbares Minimalbeispiel, der < operator sieht erstmal korrekt aus, der Fehler wird also wohl woanders liegen. Ansonsten ist

    return this->year < d2.year ? true : false;
    

    nicht besonders hübsch,

    return this->year < d2.year;
    

    tut es genauso.



  • oh stimmt... da hab ich mal wieder zu kompliziert gedacht.

    mir ist grad aufgefallen, da stimmt nochwas nicht... Bei Eingabe 11.11.1111 11:11 ist this->year = 2010 !?

    Ok, da muss ich nochmal schauen... Danke erstmal, ich meld mich wieder, wenn ich es eingegrenzt habe (oder vllt find ich's ja selbst) 😉



  • bool operator< (const Date& lhs, const Date& rhs)
    {
      if(lhs.year != rhs.year)
        return lhs.year < rhs.year;
    
      if(lhs.mon != rhs.mon)
        return lhs.mon < rhs.mon;
    
      if(lhs.day != rhs.day)
        return lhs.day < rhs.day;
    
      if(lhs.hour != rhs.hour)
        return lhs.hour < rhs.hour;
    
      if(lhs.min != rhs.min)
        return lhs.min < rhs.min;
    
      return lhs.sec < rhs.sec;
    }
    

    guck mal - schon kann man es lesen - allerdings liegt der Fehler nicht hier...
    Jz musst du nur noch die Variablennamen durch Getter-Fkt-Aufrufe ersetzen (da der op< nicht wirklich ein Member sein sollte^^)
    Die Variablennamen find ich nebenbei gesagt auch relativ hässlich - schreib sie doch einfach aus - wird dich auch nicht umbringen ;o)

    bb


Anmelden zum Antworten