Forum: PC-Programmierung Problem mit enum in C++


von Marcell (Gast)


Lesenswert?

Hallo,
ich habe ein verständisproblem zu enums und hoffe, dass ihr mir dabei 
helfen könnt.

Ich definiere in einer Klasse mit dem Namen 'day' z.B. zwei Enums:
1
enum days{ monday=0,
2
           tuesday,
3
           wednesday
4
           thursday,
5
           friday,
6
           saturday,
7
           sunday}
8
9
enum time{ morning=0,
10
           midday,
11
           afternoon,
12
           night,
13
           midnight}

In meiner main-function definiere ich ein Objekt, welches somit diese 
beiden enums kennt.

aber wie kann ich jetzt die einzelnen inhalte abfragen?


ich würde gerne folgendes machen (dazu habe ich mir zwei variablen 
erstellt (tag, zeit)
1
if(tag == day::monday)
2
{ // do sth.
3
}
4
else if(tag== day::tuesday)
5
{
6
  if(zeit==time::morning)
7
    {//do sth.
8
    }
9
  else if(zeit==time::midday)
10
    {// do sth. different
11
    }
12
}

komme da aber absolut nicht weiter.
Marcell

von Slippin J. (gustavo_f)


Lesenswert?

Dein Enum heißt doch days. Also muss du doch darauf abfragen. Wenn deine 
Klasse day (ungünstiger Name!), dann in etwa so day::days::monday

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Enums sind keine Klassen, daher ist der ::-Oberator nicht korrekt.

Es sei denn, Deine enums gehören zu einer Klassendeklaration:

1
class bla
2
{
3
public:
4
  enum days{ monday=0,
5
           tuesday,
6
           wednesday
7
           thursday,
8
           friday,
9
           saturday,
10
           sunday};
11
12
  enum time{ morning=0,
13
           midday,
14
           afternoon,
15
           night,
16
           midnight};
17
18
etc. ...
19
20
}

Dann wird der ::-Operator verwendet, aber nicht mit dem Namen des 
jeweiligen enums, sondern mit dem der Klasse, in deren Namensraum der 
enum deklariert wurde.

Im Beispiel also
1
if (time == bla::midday)
2
...

Das ist wegen potentieller Namenskonflikte nicht besonders elegant.

In C11 gibt es eine Erweiterung namens "enum class", damit ist die von 
Dir verwendete Syntax verwendbar:

http://stackoverflow.com/questions/12183008/how-to-use-enums-in-c

von Rolf M. (rmagnus)


Lesenswert?

Marcell schrieb:
> ich würde gerne folgendes machen
 [...]
> komme da aber absolut nicht weiter.

Was meinst du damit? Wenn du das gerne so machen würdest, dann mach es 
doch einfach so. Sieht alles korrekt aus.

von Klaus K. Klops (Gast)


Lesenswert?

War doch schon fast richtig.
1
class Foo
2
{
3
public:
4
5
  enum days {
6
    monday = 0,
7
    tuesday,
8
    wednesday,
9
    thursday,
10
    friday,
11
    saturday,
12
    sunday
13
  };
14
15
  enum time {
16
    morning = 0,
17
    midday,
18
    afternoon,
19
    night,
20
    midnight
21
  };
22
23
  // Verwendung innerhalb der Klasse.
24
  void bla()
25
  {
26
    days tag = days::monday;
27
28
    // days tag2 = monday;
29
30
    time zeit = time::morning;
31
32
    if (tag == days::monday)
33
    {
34
    }
35
    else if (tag == days::tuesday)
36
    {
37
      if (zeit == time::morning)
38
      {
39
      }
40
      else if (zeit == time::midday)
41
      {
42
      }
43
    }
44
  }
45
};
46
47
// Verwendung außerhalb der Klasse.
48
int main()
49
{
50
  Foo::days tag = Foo::days::monday;
51
  
52
  // Foo::days tag2 = Foo::monday;
53
  
54
  Foo::time zeit = Foo::time::morning;
55
56
  if (tag == Foo::days::monday)
57
  {
58
  }
59
  else if (tag == Foo::days::tuesday)
60
  {
61
    if (zeit == Foo::time::morning)
62
    {
63
    }
64
    else if (zeit == Foo::time::midday)
65
    {
66
    }
67
  }
68
};

Dass

days tag2 = monday;
bzw.
Foo::days tag2 = Foo::monday;

auch funktionieren würde, ist eher ein Nachteil von enums, besonders von 
globalen. Darum setzt man sie (also globale enums) oft in eigene 
Sub-Namespaces. Mit "enum class" ist das allerdings nicht mehr nötig.

> In meiner main-function definiere ich ein Objekt, welches somit diese
> beiden enums kennt.

In diesem Sinn kennt die Klasse die Enums. Also 
DeineKlasse::time::morning oder DeineKlasse::morning, nicht 
DeinObjekt.time::morning oder wie auch immer du es probiert hast.

von Manno (Gast)


Lesenswert?

> Marcell schrieb:
>  [...]
> Sieht alles korrekt aus.

Die bedingte Verzweigung mag korrekt ausschauen, wäre aber 
handwerklicher Pfusch.
Erstmal würde sich hier bei einem enum eine switch-case Abfrage 
anbieten.
Die würde es schon mal etwas leserlicher machen. Das eigentliche Problem 
bestünde aber weiterhin:
7 * 5 = 35 mögliche Ergebnisse = sehr viel, sehr unschöner Code.

Und Morgen kommt jemand und möchte genaue Urzeiten für 'time' definieren 
oder weitere hinzufügen. Dann hätte man schnell 400+x Zeilen mit 
Abfragen und inkludierten Code; und mit Sicherheit ebenso doppelten.

Soetwas möchte man nicht der Nachwelt hinterlassen.

ber lösbar z.B. mit einem Zustandsautomaten nach Fowler et al.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.