überladener operator und cout

Von: , Frage gestellt am So, 1. Feb 2009

Hallo zusammen,

folgendes Problem

ich habe eine datumsklasse geschrieben und und diverse operatoren dafür überladen... so auch dne operator ++... funktioniert soweit auch ganz gut AUSSER wenn ich den operator innerhalb einer cout anweisung benutze... verstehe aber das problem nicht

....
int main()
{
Datum d(22,1,2009);
cout << "Datum : " << d << endl;
cout << "Datum : " <<
<< "++Datum : " << ++d << endl;
return 0;
}
die erste cout-Anweisung funktioniert perfekt... initialisiertes Datum wird ausgegeben!
bei der 2. cout-Anweisung sollte man meinen das 22.01.2009 und 23.01.2009 ausgegeben... nicht bei mir... es wird 2x 23.01.2009 ausgegeben. wo liegt das problem?

Danke

lg Enrico

10 Antworten zu dieser Frage

  1. Antwort von nach 27 Minuten 0 hilfreich
    Re: überladener operator und cout

    Hallo, ich habe eine datumsklasse geschrieben und und diverse
    operatoren dafür überladen... so auch dne operator ++...
    Es gibt zwei ++-Operatoren, einen Präfix- und einen Postfixoperator. Welchen hast du überladen?

    :   cout << "Datum   : " <<
    :        << "++Datum : " << ++d << endl;
    :   return 0;
    :}
    
    bei der 2. cout-Anweisung sollte man meinen das 22.01.2009 und
    23.01.2009 ausgegeben
    Man sollte meinen, es würde "Datum :++Datum" und dann ein Datum ausgeben...

    Grüße,
    Moritz

    • Antwort von nach einer Stunde 0 hilfreich
      Re^2: überladener operator und cout

      Hallo,

      es wurden beide - Post & Präfixoperatoren überladen
      sieht in etwa so aus:

      :Datum& operator ++()
      :{
      :     if (1+tg > maxDays(mn,jr))
      : {
      : tg = (++tg)- maxDays(mn,jr);
      : ++mn;
      : }
      : else
      : ++tg;
      : return *this;
      :}
      :Datum operator ++(int)
      :{
      : Datum tmp = *this;
      : ++*this;
      : return tmp;
      :}
      

      Danke schon mal für die Hilfe

      Enrico [Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

  2. Antwort von nach 7 Stunden 0 hilfreich
    Re: klebt nach links

    Hallo Enrico,

    Der Ausdruck

     cout << d;

    gibt eine Referenz Datum& zurück (nehme ich mal an).
    Typisch nimmt man hier eine ostream&, damit sich das dann beliebig verketten lässt.

    ostream&  operator<<(ostream& o, const Datum &d);
    
    nicht bei mir... es wird 2x
    23.01.2009 ausgegeben. wo liegt das problem?
    Du hast den Operator ++ für beide Seiten überladen, also gilt er auch für die Referenz von links, und das nächste Objekt kriegt dann gar keinen ++ mehr ab und gibt dasselbe wieder aus.
    Wahrscheinlich reicht es schon, wenn du das passend klammerst:

    (++d)
    

    oder Du entfernst die eine op++, so dass der ++ nur für links verfügbar ist.

    lG
    Martin B

    • Antwort von nach einem Tag 0 hilfreich
      Re^2: klebt nach links

      Hallo,

      die überladung von << über ostream ist soweit richtig
      aber selbst mit dem klammern kommt da nur kauterwelch raus...
      innerhalb der cout anweisung wir der wert von 'd' sofort inkrementiert und der neue wert für die ganze anweisung geändert.

      wenn d = "01.01.2009" ist ergibt die Anweisung:

      cout << "Gerade noch: " << d << "\nund nun schon: " << ++d << endl;
      

      die augabe:

      Gerade noch: 02.01.2009
      und nun schon: 02.01.2009

      die überladung von ++ in der präfix notation habe ich vorerst ausgeklammert... ohne erfolg!

      Enrico

      • Antwort von nach 2 Tagen 0 hilfreich
        Re^3: klebt nach links

        Hallo,
        die überladung von << über ostream ist soweit richtig
        aber selbst mit dem klammern kommt da nur kauterwelch raus...
        innerhalb der cout anweisung wir der wert von 'd' sofort
        inkrementiert und der neue wert für die ganze anweisung
        geändert.
        mach mal:

        ...
        cout << "Erst " << ++d << "\ndann " << d << "\ndann " << d++ << endl;
        ...
        


        Wenn Du Deine Klasse ordentlich geschrieben hast, müsste
        sowas wie
        Erst 24
        dann 24
        dann 22
        

        rauskommen.

        Fazit: Ergebnis undefiniert, da kein Sequenzpunkt
        (http://en.wikipedia.org/wiki/Sequence_point )
        zwischen den Inkrementierungen:
        i++ + i++ => http://www.research.att.com/~bs/bs_faq2.html#evaluat...


        Grüße

        CMБ

        • Antwort von nach 2 Tagen 0 hilfreich
          Re^4: klebt nach links

          Hm.... dem ist auch so.... also lässt sich das nicht wirklich sinnvoll einbinden. aber wieso funtioniert es mit den standarddatentypen? Warum zeigt:

          :int i=5;
          :cout << i << '\n' ++ i << endl;
          


          5
          6

          ?
          ... alles sehr verwirrend... aber Danke für die Hilfe

          lg Enrico :) [Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

          • Antwort von nach 2 Tagen 0 hilfreich
            Re^5: klebt nach links

            Hallo, Hm.... dem ist auch so.... also lässt sich das nicht wirklich
            sinnvoll einbinden. aber wieso funtioniert es mit den
            standarddatentypen? Warum zeigt:

            :int i=5;
            :cout << i << '\n' ++ i << endl;
            

            <i>
            5
            6
            bei mir:

            int i=5;
            cout << i << '\n' << ++ i << endl;
            


            6
            6 ... alles sehr verwirrend...
            Nicht verwirrend, *undefiniert*. ;-)

            Grüße

            CMБ

            • Antwort von nach 2 Tagen 0 hilfreich
              Re^6: klebt nach links

              Sicher? ich habs extra nochmal ausprobiert weil ich ein wenig 'geschummelt' hab.... ich bekomm wirklich 5 und 6 ausgegeben...
              ich verwende den allgemein gepeinigten dev cpp 5.irgendwas compiler
              hab aber nachdem ich irgendwo gelesen hab, das man dieses "cout" problem umgehen kann allesmögliche an optimierungsoptionen ausgeschaltet.

              Enrico [Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

      • Antwort von nach 3 Tagen 0 hilfreich
        Re^3: den ganzen Code

        Hallo

        Am besten zeigst Du mal den kompletten Code, ein lauffähiges Testprojekt.
        Wäre doch gelacht.

        lG
        Martin B



Keine passende Antwort gefunden? Jetzt eigene Frage stellen!