Problem mit Operatorüberladung



  • Hallo zusammen,

    ich habe ein kleines Problem, dessen Ursache mir bisher nicht klar ist. Aber ich füge erstmal den Quellcode ein.

    class GregDatum{
    
    	bool fehler;
    	int tag, monat, jahr;
    
    protected:		
    	int jd, auslassJd, auslassTage, auslassJahr;
    
    public:
    	GregDatum();	//Standardkonstruktor 
    	~GregDatum() {}  //Destruktor
    	bool operator<(const GregDatum &datum2) const;
    	int operator-(const GregDatum &datum2) const;
    private:
            virtual void setzAuslassJD()=0;
    };
    
    class GregDatumItalien: public GregDatum
    {
    public:
    	GregDatumItalien();
    	GregDatumItalien(const int julDat);  
    	GregDatumItalien(const int t, const int m, const int j); 
    private:
    	void setzAuslassJD();
    };
    
    bool GregDatum::operator<(const GregDatum &datum2) const
    {
    	return jd<datum2.jd;
    }
    
    int GregDatum::operator-(const GregDatum &datum2) const
    {
    	return jd-datum2.jd;
    }
    

    So, dass waren die relevanten Teile des Quellcodes. Nun zum Problem:
    Wenn ich im Programm zwei Objekte der Klasse GregDatumItalien (nennen wir sie datum1 und datum2) erzeuge, und dann im Quellcode datum1<datum2 schreibe, funktioniert das wunderbar.
    Schreibe ich aber datum1-datum2, so bekomme ich eine Fehlermeldung vom Compiler, dass es keinen Überladenen Opertator- gibt, der einen rechtsseitigen Typ der Klasse GregDatumItalien akzeptiert.
    Wieso funktioniert das ganze mit dem einen Operator, mit dem anderen aber nicht?
    In beiden Fällen wird doch mit einer Referenz auf die Oberklasse gearbeitet und ein Objekt der abgeleiteten Klasse übergeben. Im Sinne der Polymorphie dürfte das kein Problem sein.

    Naja, vielleicht sehe ich den Wald vor lauter Bäumen nicht. Vielen Dank schon mal für alle Antworten.

    Gruß, Ralf.



  • versuche mal, ein minimalbeispiel zu finden, bei dem der fehler auftritt.
    außer dass man normalerweise nicht memberfunktionen nimmt, sieht es ganz ok aus (im ersten überflug)



  • Warum liefert operator- einen int und kein GregDatum zurück?

    btw: Der return-Wert von operator- sollte const sein.



  • Weil die Differenz von zwei Daten kein Datum ist, sondern eine Anzahl von Tagen.

    Was würdest Du sagen, was 31.10.2003 - 30.10.2003 ist? 1.10.2003 oder 1.0.0?
    Da halte ich 1 für ein sinnvolles Ergebnis.
    Für mich sieht das Beispiel eigentlich auch ganz okay aus.

    Versuch mal die Operatoren nicht als member zu implementieren.



  • Mich wundert es etwas, daß dein Code übersetzt wird. Ich ging immer davon aus, daß der operator- eine Instanz deiner Klasse zurückgeben muß. And deiner Stelle würde ich eine Funktion diff implementieren, die dir die Differenz berechnet.



  • Zunächst mal vielen Dank für die Antworten.

    Ich habe den Operator- jetzt mal als globale Funktion und nicht als Memberfunktion implementiert. Und dann funktioniert das auch.
    Das würde dann ja für die Theorie von Slowmotion sprechen, dass eine Instanz der Klasse zurückgegeben werden muss...
    Naja, wie dem auch sei. Es funktioniert jetzt und das reicht mir dann auch.

    Gruß, Ralf.



  • Davon habe ich noch nie was gehört. Soweit ich weiß gibt es auch einige Vektor-Klassen die das Skalarprodukt durch Überladung von * berechnen. Da kommt auch nur eine Zahl raus und kein Vektor.

    MfG Jester



  • Ich kann Dein Codebeispiel übrigens übersetzen, linken haut nicht hin, weil die Definitionen der Methoden fehlen, aber sonst geht es.
    Welchen Compiler verwendest Du denn?

    MfG Jester



  • Compilieren und linken funktionierte bei mir auch ohne Probleme. Das Problem tauchte erst dann auf, wenn ich versucht habe, 2 Daten voneinander abzuziehen (wenn also im Quellcode irgendwo steht "datum1-datum2".
    Dann gabs die Fehlermeldung, dass es keinen überladenen Operator - gibt, der einen rechtsseitigen Typ GregDatumItalien akzeptiert. Obwohl die Elementfunktion ja existiert.



  • Zeig doch bitte mal einen Minimalcode, mit dem man den Fehler reproduzieren kann.



  • Hab gerade versucht, einen Minimalcode zusammzukopieren und was war? Natürlich hast jetzt funktioniert... In den Originaldateien aber nicht. Egal. Ich habe ja die Überladung als globale Funktion ausgelagert und damit gehts. Hauptsache es funktioniert.

    Also, nochmal vielen Dank für die vielen schnellen Antworten.

    Gruß, Ralf.


Anmelden zum Antworten