Datum erhöhen, die fünfte Version
-
Jetzt ist das Problem mit add_day. Wieso erhalte ich ungültige Werte in add_day obwohl dort eine Prüfung eingebaut wurde?
class Date{ public: enum Month{ jan=1,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec }; int day() const { return d; }; Month month() const { return m; }; int year() const { return y; }; void add_day(int n); // increase Day with n value void add_month(int n); // increase Month with n value void add_year(int n); // increase Year with n value Date(int y, Month m, int d); private: int y; // Year Month m; int d; // Day }; Date::Date(int y, Month m, int d):y(y),m(m),d(d) // checking for valid date and { // does the initialization if(y<1200 || y>2200 || d<1 || d>31) { this->y = 0; this->d = 0; } } void Date::add_day(int n) { if(d + n >= 32) { d = 0;} else {d = d + n;} } void f() { const Date today(1978,Date::jun,25); cout << today.day() << endl; Date tomorrow = today; tomorrow.add_day(1); cout << tomorrow.day() << endl; Date non(2240,Date::sep,28); cout << non.year() << endl; non.add_day(12); cout << non.day() << endl; } 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("~"); }
-
if(d + n >= 32) { d = 0;}Wenn du mir den Monat mit 32 Tagen zeigst, zeige ich dir den Fehler :p
-
Ach nee wieder ein schreib Fehler, auf 31 korrigiert, doch wo ist der Fehler.
-
nutz den debugger
-
Ne der 32 ist kein Fehler. Damit meine ich wenn der Wert von d 32 ist oder grösser dann sollte d den Wert 0 erhalten.
-
Fehler gefunden.
-
Ich würde assert verwenden.
-
314159265358979 schrieb:
Ich würde assert verwenden.

Obwohl die "Fehlerbehandlung" hier natürlich auch in's Gesamtkonzept der Anwendung passen muss/sollte. So generell.
-
Um die Gedanken meiner Vorposter etwas auszuführen:
Date::Date(int y, Month m, int d):y(y),m(m),d(d) // checking for valid date and { // does the initialization if(y<1200 || y>2200 || d<1 || d>31) { this->y = 0; this->d = 0; } }Diese Art von "Fehlerbehandlung" ist das Allerschlimmste, was man machen kann. Wenn ich ein Datum erstelle und nichts passiert, erwarte ich, dass das Objekt das von mir angegebene Datum enthält. Dass aber einfach so irgendwelche willkürlichen anderen Daten zugewiesen werden – dann noch ungültige (welcher Monat hat einen nullten Tag?) und inkonsistente (Jahr und Tag wird verändert, aber Monat bleibt?) – ist sehr schlecht und intransparent für den Benutzer. Es kann hingegen angebracht sein, wenn ein sinnvoller Default-Wert als Fallback existiert, was hier nicht gegeben ist.
Nimm wie schon angetönt einen sinnvollen Fehlerbehandlungsmechanismus. Das können Exceptions sein, wobei dann Leute auf die Idee kommen, damit Logikfehler abzufangen. Ich würde auch
assertnehmen, ein falsches Datum hat sofort bemerkt zu werden.