Datum erhöhen, die zweite Version
-
Das ist die dritte Version der Date Aufgabe, und eine Frage habe ich. Ist der folgende Code korrekt? Was mich interessiert ist ob der Date Konstruktor Memberinitialisierer korrekt ist?
class Date{ int y,m,d; // Year, Month, Day public: Date(int yy,int mm,int dd); // check for a valid Date and initialized it void add_day(int n); // increase Date with n Days int month() {return m;} int day() {return d;} int year() {return y;} }; Date::Date(int yy,int mm,int dd):y(yy),m(mm),d(dd) { if(y<1200 || y>2200 || m<1 || m>12 || d<1 || d>31) { y = 0; m = 0; d = 0; } else { y = yy; m = mm; d = dd; } } void Date::add_day(int n) { if(d + n >= 32) { d = 0;} else {d = d + n;} } ostream& operator<<(ostream& os, Date& d) { return os << '"' << d.day() << '"' << '\n'; } void f() { Date today(1978,6,25); cout << today; Date tomorrow = today; tomorrow.add_day(1); cout << tomorrow; Date non(2009,9,56); cout << non; Date non2(2010,10,29); non2.add_day(12); cout << non2; } int main() try{ f(); keep_window_open(); return 0; } catch (runtime_error e) { cout << e.what() << '\n'; keep_window_open("~"); } catch (...) { cout << "exiting\n"; keep_window_open("~"); }
-
Wie wärs mit:
cout << today;anstatt:
operator<<(cout, today);
-
314159265358979 schrieb:
Wie wärs mit:
cout << today;anstatt:
operator<<(cout, today);Gerade korrigiert.
-
Ich würde an deiner Stelle das \n nicht in den operator << geben, sondern einfach
cout << today << endl;schreiben.
-
314159265358979 schrieb:
Ich würde an deiner Stelle das \n nicht in den operator << geben, sondern einfach
cout << today << endl;schreiben.
OK gemacht, aber mich interessiert ob der Konstruktor Memberinitialisierer korrekt ist?
-
Date::Date(int yy,int mm,int dd):y(yy),m(mm),d(dd) { if(y<1200 || y>2200 || m<1 || m>12 || d<1 || d>31) { y = 0; m = 0; d = 0; } else { y = yy; m = mm; d = dd; } }Das ergibt keinen Sinn. Deine Membervariablen werden hier in jedem Fall 2 mal "initialisiert". Es macht auch keinen Sinn, die Werte zu überprüfen. Ein Assert reicht.
-
Und das hier, die Übung verlang eine Überprüfung der werte:
Date::Date(int yy,int mm,int dd):y(yy),m(mm),d(dd) { if(yy<1200 || yy>2200 || mm<1 || mm>12 || dd<1 || dd>31) { y = 0; m = 0; d = 0; } else { yy; mm; dd; } }
-
Ein assert ist eine ausreichende Überprüfung.
-
So weit bin ich nicht im Buch und ich weiss nicht was ein assert ist. Die Übung muss man im Konstrutor eine Überprüfung machen.
-
#include <cassert> . . . Date::Date(int yy, int mm, int dd) : y(yy) , m(mm) , d(dd) { assert(yy > 1200 && yy <= 2200 && mm > 0 && mm <= 12 && dd > 0 && dd <= 31); } . . .
-
bäh, verdrückt. post löschen bitte.
-
assert ist nicht dazu gedacht, Usereingaben zu kontrollieren, sondern Programmfehler zu identifizieren. Gut er macht hier zwar keine Usereingabe, aber vielleicht will er dies ja später nachholen.
@ winux
Was du gerade machst ist doppelt gemoppel, einmal weist du die Werte mit der Initialisierungsliste zu, und danach überprüfst du diese und überschreibst sie... Was denkst du macht das hier?else { yy; mm; dd; }Nichts!
-
Das da nichts gemacht wird ist mir klar, nur wie löse das der Konstuktor die Werte prüft und nur dann initialisiert wenn die Werte korrekt sind.
-
Es macht keinen Sinn, die Werte zu ändern, wenn sie ungültig sind. Benutze assert.
-
Auf die Initialisierungsliste verzichten ist z.B. möglich. In der Regel möchte man dies aber nicht.
Date::Date(int yy,int mm,int dd) { if(yy<1200 || yy>2200 || mm<1 || mm>12 || dd<1 || dd>31) { y = 0; m = 0; d = 0; } else { y = yy; m = mm; d = dd; } }
-
Das Problem ist assert kenne ich noch nicht. Aber wie wehre es damit:
Date::Date(int yy,int mm,int dd):y(yy),m(mm),d(dd) { if(yy<1200 || yy>2200 || mm<1 || mm>12 || dd<1 || dd>31) { y = 0; m = 0; d = 0; } }
-
Dann sieh dir assert doch einfach an. -> Google
-
Geht.
-
OK werde es machen.
-
Danke an alle für die Tipps und Hilfe.