Enum?

Hallo!

Ich habe vor kurzem angefangen, C++ zu lernen. In folgendem Programm wollte ich die Sekundenzahl von Zeiteinheiten anzeigen lassen. Was stimmt daran nicht?

#include

int x;
void main()
{

int Zeiteinheit;
enum Zeiteinheit {Sekunde, Minute, Stunde};

cout > Zeiteinheit;

if (Zeiteinheit==Sekunde) {
x=1;
} else if (Zeiteinheit==Minute) {
x=60;
} else if (Zeiteinheit==Minute) {
x=60;
} else if (Zeiteinheit==Stunde) {
x=3600;
}

cout

‚using‘ und ‚case‘
Hallo Discordia,

#include

In C++ verwendet man besser anstelle von
Je nach verwendetem Compiler wird diesbezüglich eine Warnung ausgegeben (Warnungen sollte man nicht auf die leichte Schulter nehmen).
Du solltest noch mit angeben, welche Objekte du aus iostream benötigst, also zum Beispiel

using std::cout;
using std::cin;
using std::endl;


> int x;

Wozu soll x global deklariert sein? Wenn möglich, solltest du x innerhalb der main-Funktuion deklarieren.

> void main()

Genaugenommen sollte die main-Funktion nicht als void-, sondern als int-Funktion definiert werden. Bei ordnungsgemäßem Abarbeiten der main-Funktion sollte der int-Wert 0 zurückgeliefert werden, ansonsten ungleich 0.

> {  
>   
> int Zeiteinheit;  
> enum Zeiteinheit {Sekunde, Minute, Stunde};  
>   
> cout \> Zeiteinheit;  
>   
> if (Zeiteinheit==Sekunde) {  
> x=1;  
> } else if (Zeiteinheit==Minute) {  
> x=60;  
> } else if (Zeiteinheit==Minute) {  
> x=60;

Diese Zeile ist dir vermutlich aus Versehen doppelt geraten.

> } else if (Zeiteinheit==Stunde) {  
> x=3600;  
> }  
>   
> cout Als gravierenden Fehler kann ich eigentlich nur das fehlende using... ausmachen.


Aber einen Tipp habe ich noch:
Man kann unübersichtliche if-Kaskaden vermeiden, indem man die switch-Anweisung verwendet:

    
     switch (Zeiteinheit)
     {
     case Sekunde: x=1; break;
     case Minute: x=60; break;
     case Stunde: x=3600; break;
     default: cout 
    Durch das break wird die switch-Anweisung verlassen. Bei fehlendem break wird zum nächsten case gegangen. Dies wird ahand des folgenden Beispiels deutlich:
    
        
         x=1;
         switch (Zeiteinheit)
         {
         case Stunde: x\*=60;
         case Minute: x\*=60;
         case Sekunde: break;
         default: cout 
        Im Fall Zeiteinheit==Stunde wird x zweimal mit 60 multipliziert, also insgesamt mit 3600. Im Fall Zeiteinheit==Minute wird nur einmal mit 60 multipliziert und bei Zeiteinheit==Sekunde passiert gar nichts. Ansonsten wird eine Fehlermeldung ausgegeben.
        
        Viele Grüße
        Jens

Hallo,

also, mir ist noch aufgefallen, daß der implizite Cast einer enum auf Integer nicht sicher ist. Das war in C glaube ich zwar so, aber in C++ ist das nicht mehr gut und sollte vermieden werden.

Hintergrund ist, daß Enums nur intern verwendet werden sollten, aber nicht im Interface. Wenn man auf konkrete Werte zurückgreifen will, sollte man die in der Klasse als „const int“ oder von mir aus als „static const int“ (das benutze ich immer) deklarieren. Hier wäre das dann statt

class meineklasse {
enum Zeiteinheit {Sekunde, Minute, Stunde};
};

das folgende:

class meineklasse {
static const int Sekunde = 0;
static const int Minute = 1;
static const int Stunde = 2;
};

Wenn man das wie oben macht, ist halt keine vernünftige Zuordnung zwischen einem Wert, den der Benutzer eingibt, und einer internen Funktionalität möglich.

Compiliert zwar, ist aber gefährlich und auf jeden Fall schlechter Stil.

Chris