class zeit



  • Kann mir irgnedeiner sagen warum das nicht geht ? Ich kapiers echt nicht.

    #ifndef ZEIT_HPP
    #define ZEIT_HPP
    
    class zeit
    {
        private:
            int hour;
            int minute;
            int second;
        public:
            //default constructor
            zeit():hour(0),minute(0),second(0)
            {
                //no more
            }
    
            //first constructor
            zeit(int h):hour(h),minute(0),second(0)
            {
                if(0<hour||hour>23)
                hour=0;
            }
    
            //second constructor
            zeit(int h,int m):hour(h),minute(m),second(0)
            {
                if(0<hour||hour>23)
                hour=0;
    
                if(0<minute||minute>59)
                minute=0;
            }
    
            //third constructor
            zeit(int h,int m,int s):hour(h),minute(m),second(s)
            {
                if(0<hour||hour>23)
                hour=0;
    
                if(0<minute||minute>59)
                minute=0;
    
                if(0<second||second>59)
                second=0;
            }
    };
    
    #endif
    

    Der Compiler meint: zeit.hpp 4: Declaration syntax error
    Ich versteh das einfach nicht.



  • Ist auch in Ordnung...

    Ich vermute das nicht deine zeit.hpp das Problem ist sondern die Zeile vor deinem #include "zeit.hpp" in einer anderen Datei(wo du zeit.hpp halt includest).
    Meistens ein vergessenes Semikolon oder so, dann kommen solche Fehler.



  • Jepp, das wars !
    Danke dreaddy !
    Mein Kopf 😡 wär schon fast explodiert.



  • Warum machst du drei Konstruktoren ?
    Mach doch einen mit standardparametern.



  • Wie meinst du das ? Gibt es eine Möglichkeit die Konstruktoren zuzsammenzufassen ?



  • Ja

    Du vergibst einfach standard parameter.

    Zeit(int _hour=0,int _minute=0,int _second=0):hour(_hour),minute(_minute),second(_second)
    {
       if(0<hour||hour>23)
                hour=0;
    
                if(0<minute||minute>59)
                minute=0;
    
                if(0<second||second>59)
                second=0;
    }
    

    Du kannst dann den Ctor mit 0-3 Parametern aufrufen.
    also Zeit(),Zeit(3) oder Zeit(3,4) oder Zeit(3,4,5)

    Die initialisierungen wären dann(in der selben Reihenfolge):

    1. Hour=0
      Minute=0
      Second=0

    Hour=3
    Minute=0
    Second=0
    3)
    Hour=3
    Minute=4
    Second=0
    4)
    Hour=3
    Minute=4
    Second=5

    [ Dieser Beitrag wurde am 10.07.2003 um 13:35 Uhr von prolog editiert. ]



  • Danke für den Tip ! Das ist natürlich viel kürzer.



  • leider ist

    if(0<hour||hour>23)
                hour=0;
    

    kompletter unfug.

    richtig ist einzig und allein:

    if(0<hour||hour>23)
                hour=42;
    


  • Original erstellt von volkard:
    **leider ist

    if(0<hour||hour>23)
                hour=0;
    

    kompletter unfug.

    richtig ist einzig und allein:

    if(0<hour||hour>23)
                hour=42;
    

    **

    Sorry, versteh ich nicht. 😕



  • Original erstellt von prolog:
    Sorry, versteh ich nicht. 😕

    und ich versteh erst recht nicht, wozu die dinge auf 0 gesetzt werden, wenn mist reinkam. mist hat nicht reinzukommen. ängsliche naturen mögen an assert denken. aber nen fehler einfach vertuschen, das ist nicht gut.



  • ich persoenlich wuerde aus 61 sekunden nicht 0 sekunden machen, sondern 1 sekunde und die minuten um eins erhoehen.



  • ich würd err_bad_parameter zurückgeben. im ctor also n assert.



  • volkard hat Recht. Das mit dem

    if(0<hour||hour>23)
    

    ist natürlich total schwachsinnig.
    Ich meinte

    if(hour<0||hour>23)
    

    Aber auch das wäre natürlich eine Fehlervertuschung gewesen.
    Am liebsten hätte ich implementiert, dass zeit gar nicht initialisiert wird wenn Mist rein kommt, wie volkard es so schön ausgedrückt hat. Weiß leider noch nicht wie das geht, weil ich blutiger C++-Anfänger bin, deshalb hab ich default 0 gesetzt, einfach so :p



  • Original erstellt von PeterTheMaster:
    ich persoenlich wuerde aus 61 sekunden nicht 0 sekunden machen, sondern 1 sekunde und die minuten um eins erhoehen.

    Hast Recht



  • immer wieder praktisch ist

    int range(int min,int x,int max)
    {
       return min<=x && x<=max;
    }
    

    und dann sowas wie

    zeit(int h,int m,int s)
    :hour(h),minute(m),second(s)
    {
       if(!range(0,h,23))
          kritischerfehler();
       if(!range(0,minute,59))
          kritischerfehler();
       if(!range(0,sekunde,59))
          kritischerfehler();
    }
    

    für die kritischen fehler gibts was:

    zeit(int h,int m,int s)
    :hour(h),minute(m),second(s)
    {
       assert(range(0,h,23));
       assert(range(0,minute,59));
       assert(range(0,sekunde,59));
    }
    

    und jetzt kämen einige scherzkekse sicherlich sogar noch auf die idee, daß die anderen konstruktoren unnötig sind, wenn man default-parameter verwendet:

    zeit(int h=0,int m=0,int s=0)
    :hour(h),minute(m),second(s)
    {
       assert(range(0,h,23));
       assert(range(0,minute,59));
       assert(range(0,sekunde,59));
    }
    

    das assert hat übrigens ne feine eigenschaft. es wirkt nur, wenn man im debug-modus compiliert. also solange man selber rumtestet. im releasemodus testet es einfach nicht, und der code, den man dann ausliefert, ist nicht lahm wegen der tests.


Anmelden zum Antworten