Problem mit enum in C++

Gast #4864613
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
Persönliche Seite #4864629
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
Gast #4864680
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.
Gast #4866329
> 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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.