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 
viel spaß beim studieren 
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>