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 assert nehmen, ein falsches Datum hat sofort bemerkt zu werden.


Anmelden zum Antworten