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