Operator Overloading



  • Hallo! Ich bin zwar neu hier, hoffe aber doch daß jemand antwortet.

    Ich hab ein ganz blödes Problem:

    Habe eine Klasse CDatum und brauche einen operator+(int i) als Member der Klasse, der in der Main ermöglicht date1 = date1 + 3 auszugeben.

    Leider bekomm ich das nicht hin.

    Ich weiß ja daß das für Euch alle lächerlich ist aber ich bin ein Anfänger der halt mit so blöden Kleinigkeiten noch zu kämpfen hat.

    Danke für jede Antwort!



  • hier ist Code aus einer Datumsklasse von mir:

    friend Datum& operator+=(Datum& d, int tage)
        {
            if (!istDatumGueltig(d.t,d.m,d.j))
                throw datum_ungueltig();
    
            if (tage==0)
                return d;
    
            if (istDatumGueltig(d.t+tage,d.m,d.j))
            {
                d.t += tage;
            }
            else
            {
                int ueberschuss = (d.t+tage)-getTageVonMonat(d.m,d.j);
                do
                {
                    ++d.m;
                    d.t = ueberschuss;
                    if (d.m>12)
                    {
                        ++d.j;
                        d.m=1;
                    }
                    ueberschuss -= getTageVonMonat(d.m,d.j);
                }while (ueberschuss>0);
            }
    
            return d;
        };
    

    HINWEIS: Das Datenformat von meiner Klasse ist dumm. Es wäre viel einfacher gewesen, nicht T,M,J getrennt zu speichern, sondern die Tage seit einem bestimmten Tag (z.B. 1.1.1970).



  • bool istSchaltjahr(int jahr)
    {
        return (jahr%4==0&&jahr%100!=0)||jahr%400==0;
    };
    int getTageVonMonat(int monat, int jahr)
    {
        if(monat==2)
            if(!istSchaltjahr(jahr))
                return 28;
            else
                return 29;
        else if(monat==4||monat==6||monat==9||monat==11)
            return 30;
        else 
            return 31;
    };
    


  • bool istDatumGueltig(int tag, int monat, int jahr)
    {
       if (monat<1) return false;
       if (monat>12) return false;
       if (tag<1) return false;
       if (tag>getTageVonMonat(monat, jahr)) return false;
       return true;
    };
    

    wie du siehst sehr umständlich!

    mit der erwähnten anderen repräsentation könntest du einfach value += i; machen!



  • Bumm, damit hätt ich nicht gerechnet! Vielen Dank für alle Antworten. Leider ist das alles nicht das was ich will.

    Klasse:

    class CDatum
    {
    private:
    int mT,mM,mJ;
    bool isSchaltjahr(int j);
    public:
    bool Setze(int t,int m,int j);
    void GibAus();
    bool isSchaltjahr();
    friend ostream &operator <<(ostream &ostr, const CDatum &Datum);
    CDatum operator+(int i);
    };

    Main:

    ...
    cout << date1 << endl;
    date1 = date1 + 3;
    cout << date1<<endl;

    if( date1.isSchaltjahr() == true)
    {
    cout << "Schaltjahr";
    }
    else
    {
    cout << "Kein Schaltjahr";
    }

    cout << endl << endl;
    }

    So jetzt die Definition für meinen Operator:
    CDatum CDatum:: operator +(int i)
    {

    }

    Und genau da liegt der Hund begraben 😡
    Was gehört denn da hinein, damit das Ding auch funktioniert. Oder habe ich Variablen vergessen oder 😞

    [ Dieser Beitrag wurde am 01.05.2003 um 18:01 Uhr von Samyeli editiert. ]



  • da muss das rein, was ich in friend Datum& operator+=(Datum& d, int tage)
    geschrieben habe, allerdings musst du das "d." weglassen.

    CDatum& CDatum:operator +(int tage)
    {
          if (!istDatumGueltig(mT,mM,mJ)) // die anderen Variablennamen musst du auch noch anpassen!
                throw datum_ungueltig();
    
            if (tage==0)
                return d;
    
            if (istDatumGueltig(t+tage,m,j))
            {
                t += tage;
            }
            else
            {
                int ueberschuss = (t+tage)-getTageVonMonat(m, j);
                do
                {
                    ++m;
                    t = ueberschuss;
                    if (m>12)
                    {
                        ++j;
                        m=1;
                    }
                    ueberschuss -= getTageVonMonat(m,j);
                }while (ueberschuss>0);
            }
    
            return *this;
    }
    

    [ Dieser Beitrag wurde am 02.05.2003 um 11:05 Uhr von Dimah editiert. ]



  • da muss das rein, was ich in friend Datum& operator+=(Datum& d, int tage)
    geschrieben habe, allerdings musst du das "d." weglassen.

    CDatum& CDatum:operator +(int tage)
    {
          if (!istDatumGueltig(mT,mM,mJ)) // die anderen Variablennamen musst du auch noch anpassen!
                throw datum_ungueltig();
    
            if (tage==0)
                return d;
    
            if (istDatumGueltig(t+tage,m,j))
            {
                t += tage;
            }
            else
            {
                int ueberschuss = (t+tage)-getTageVonMonat(m, j);
                do
                {
                    ++m;
                    t = ueberschuss;
                    if (m>12)
                    {
                        ++j;
                        m=1;
                    }
                    ueberschuss -= getTageVonMonat(m,j);
                }while (ueberschuss>0);
            }
    
            return *this;
    }
    


  • 😃 😃 😃 😃 😃

    Vielen Vielen Dank!! Das funktioniert jetzt endlich. Das war echt lieb von Dir.

    [ Dieser Beitrag wurde am 01.05.2003 um 18:17 Uhr von Samyeli editiert. ]



  • noch operator-=

    friend Datum& operator-=(Datum& d, int tage)
        {
            if (!istDatumGueltig(d.t,d.m,d.j))
                throw datum_ungueltig();
    
            if (tage==0)
                return d;
    
            if (istDatumGueltig(d.t-tage,d.m,d.j))
            {
                d.t -= tage;
            }
            else
            {
                int unterlauf = tage-d.t;
                do
                {
                    --d.m;
                    if (d.m<1)
                    {
                        --d.j;
                        d.m=12;
                    }
                    d.t = getTageVonMonat(d.m,d.j)-unterlauf;
    
                    unterlauf -= getTageVonMonat(d.m,d.j);
                }while (unterlauf>0);
            }
    
            return d;
        };
    

Anmelden zum Antworten