überladener operator und cout

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

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   
> 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

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]

Hallo Enrico,

Der Ausdruck

 cout 
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
    
    
    > 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

Hallo,

die überladung von
cout
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

Hallo,

die überladung von

…
cout

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Б

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

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

lg Enrico :smile:


> <small>[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]</small>

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

5
6

bei mir:

 int i=5;
 cout 

6
6



> ... alles sehr verwirrend...


Nicht verwirrend, \*undefiniert\*. :wink:

Grüße

CMБ

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]

Hallo

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

lG
Martin B

ja klar… hoffentlich wird das kein 10 seiten text :wink:
viel spaß beim studieren :wink:

lg Enrico

Datum.h

#ifndef \_DATUM\_
#define \_DATUM\_
#include 
#include 

using namespace std;

class Datum
{
 private:
 int tg,mn,jr;
 bool isLeapyear(int);

 int maxDays(int mn,int jr);
 public:
 Datum();
 Datum(int tg, int mn, int jr);

 int getDay() const {return tg;}
 int getMonth() const {return mn;}
 int getYear() const {return jr;}
 const string& getDate() const;
 bool setDay(int tg);
 bool setMonth(int mn);
 bool setYear(int jr);
 bool setDate(int tg,int mn, int jr);
 bool isLeapyear();
 Datum& operator =(const Datum& d);
 Datum& operator +=(const Datum& d);
 Datum& operator +=(const int d);
 Datum& operator -=(const int d);
 Datum& operator -=(const Datum& d);
 Datum& operator +(const Datum& d);
 Datum& operator +(const int d);
 Datum& operator -(const int d);
 Datum& operator -(const Datum& d);
 bool operator ==(const Datum& d) const;
 bool operator (const Datum& d) const;
 Datum& operator ++();
 Datum& operator --();
 Datum operator ++(int);
 Datum operator --(int);
 void setNow();
};
ostream& operator
datum.cpp


    
    // Datum.cpp
    
    #include 
    #include 
    #include 
    #include 
    #include 
    #include "datum.h"
    
    using namespace std;
    
    //Private function
    bool Datum::isLeapyear(int jr)
    {
     if (!(jr % 4) && (jr % 100))
     return true;
     if (!(jr % 400))
     return true;
     return false;
    }
    int Datum::maxDays(int mn,int jr)
    {
     switch(mn)
     {
     case 1:
     case 3:
     case 5:
     case 7:
     case 8:
     case 10:
     case 12:
     return 31;
     break;
     case 2:
     if (isLeapyear(jr))
     return 28;
     else
     return 29;
     break;
     default:
     return 30;
     }
    }
    // Public Function
    Datum::smiley:atum()
    {
     tg = 1;
     mn = 1;
     jr = 2008;
    }
    
    Datum::smiley:atum(int tg, int mn, int jr)
    {
     if(!(setDate(tg,mn,jr)))
     {
     this-\>tg = 1;
     this-\>mn = 1;
     this-\>jr = 2008;
     }
    }
    const string& Datum::getDate() const
    {
     static string date;
     stringstream iostream;
     iostream \> date;
     return date;
    }
    bool Datum::setDay(int tg)
    {
     if ((tg 0))
     {
     this-\>tg = tg;
     return true;
     }
     else
     return false;
    }
    bool Datum::setMonth(int mn)
    {
     if ((tg 0))
     {
     this-\>mn = mn;
     return true;
     }
     else
     return false;
    }
    bool Datum::setYear(int jr)
    {
     if ((tg 0))
     {
     this-\>jr = jr;
     return true;
     }
     else
     return false;
    }
    bool Datum::setDate(int tg,int mn, int jr)
    {
     if (tg0)&& mn \>=1 && mn 0)
     {
     this-\>tg = tg;
     this-\>mn=mn;
     this-\>jr=jr;
     return true;
     }
     else
     return false;
    }
    bool Datum::isLeapyear()
    {
     if (!(jr % 4) && (jr % 100))
     return true;
     if (!(jr % 400))
     return true;
     return false;
    }
    Datum& Datum::operator =(const Datum& d)
    {
     tg = d.getDay();
     mn = d.getMonth();
     jr = d.getYear();
     return \*this;
    }
    Datum& Datum::operator +=(const Datum& d)
    {
     if (d.getDay()+tg \> maxDays(mn,jr))
     {
     tg = (d.getDay() + tg)- maxDays(mn,jr);
     mn = mn+1;
     }
     else
     tg=tg+d.getDay();
     return \*this;
    }
    Datum& Datum::operator +=(const int d)
    {
     if (d+tg \> maxDays(mn,jr))
     {
     tg = (d+ tg)- maxDays(mn,jr);
     mn = mn+1;
     }
     else
     tg=tg+d;
     return \*this;
    }
    Datum& Datum::operator -=(const int d)
    {
     if (tg-d maxDays(mn,jr))
     {
     tg = (d.getDay() + tg)- maxDays(mn,jr);
     mn = mn+1;
     }
     else
     tg=tg+d.getDay();
     return \*this;
    }
    Datum& Datum::operator +(const int d)
    {
     if (d+tg \> maxDays(mn,jr))
     {
     tg = (d+ tg)- maxDays(mn,jr);
     mn = mn+1;
     }
     else
     tg=tg+d;
     return \*this;
    }
    Datum& Datum::operator -(const int d)
    {
     if (tg-d d.getYear())
     return false;
     if (mn d.getMonth())
     return false;
     if (tg (const Datum& d) const
    {
     if (jr \> d.getYear())
     return true;
     if (jr d.getMonth())
     return true;
     if (mn d.getDay())
     return true;
     return false;
    }
    Datum& Datum::operator ++()
    {
     if (1+tg \> maxDays(mn,jr))
     {
     tg = (++tg)- maxDays(mn,jr);
     ++mn;
     }
     else
     ++tg;
     return \*this;
    }
    Datum& Datum::operator --()
    {
     if ((tg-1) tm\_mday;
     mn = zeit-\>tm\_mon+1;
     jr = zeit-\>tm\_year+1900;
    }
    
    ostream& operator
    
    
    > <small>[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]</small>