enum und negative Werte



  • Wenn ich einen enum mit negativen Werten definiere erhalte ich keinen Compilerfehler.

    enum MeinEnum
    {
    	WertMEins	= -1,
    	WertEins	= 1,
    	WertZwei	= 2,
    	WertDrei	= 3,
    };
    
    MeinEnum me1 = (MeinEnum)1;
    MeinEnum me2 = (MeinEnum)2;
    MeinEnum me3 = (MeinEnum)3;
    MeinEnum me4 = (MeinEnum)4;
    MeinEnum me  = (MeinEnum)-1;
    

    Wenn ich nun Debugge steht in

    -> me1 der Wert: Wert1
    -> me2 der Wert: Wert2
    -> me3 der Wert: Wert3
    -> me4 der Wert: 4 ->logisch ist ja auch nicht im enum drin
    -> me der Wert: -1 ->widerum nicht logisch. Ist ja im enum drin.

    Wieso ist das so. Dachte enum kann auch negative Zahlen aufnehmen.



  • Das kann dein Debugger halt nicht besser, weiter ist da nichts dabei.



  • y-vonne schrieb:

    Wieso ist das so. Dachte enum kann auch negative Zahlen aufnehmen.

    Kann es auch, wenn std::underlying_type<MeinEnum>::type ein vorzeichenbehafteter Skalar ist...



  • Ok. Und die Frage nun, wie kann ich ganz einfach prüfen ob ein Wert im enum vorhanden ist.



  • y-vonne schrieb:

    Und die Frage nun, wie kann ich ganz einfach prüfen ob ein Wert im enum vorhanden ist.

    Überleg dir was. Irgendwas eingebautes automatisches gibt es nicht.



  • OK



  • Bashar schrieb:

    y-vonne schrieb:

    Und die Frage nun, wie kann ich ganz einfach prüfen ob ein Wert im enum vorhanden ist.

    Überleg dir was. Irgendwas eingebautes automatisches gibt es nicht.

    Wenn Du den Enum selbst definierst, kannst Du Dir auch 'Markierungen' setzen:

    enum MeinEnum
    {
        WertMEins   = -1,
        WertEins    = 1,
        WertZwei    = 2,
        WertDrei    = 3,
        Max,
        Min = WertMEins
    };
    

    Damit kannste ganz bequem schauen, ob ein Wert in [Min, Max) liegt. Wenn die Werte von MeinEnum allerdings Lücken aufweisen ist dieses Wissen leider nur halb so wertvoll.

    Max kann dann darüberhinaus auch einen "ungültigen" Enum darstellen, á la:

    MeinEnum me;
    ...
    if (me == Max)
      raise_invalid_mein_enum_error();
    


  • Zum Aspekt Sicherheit: In C++11 gibt es jetzt das hier:

    enum class myEnum {...};
    

    Google "Strongly-typed Enumerations".



  • Hacker schrieb:

    Zum Aspekt Sicherheit: In C++11 gibt es jetzt das hier:

    enum class myEnum {...};
    

    Google "Strongly-typed Enumerations".

    super - damit kann man jetzt natürlich gucken, ob ein wert ein äquivalent im enum hat. oh wait...



  • unskilled schrieb:

    Hacker schrieb:

    Zum Aspekt Sicherheit: In C++11 gibt es jetzt das hier:

    enum class myEnum {...};
    

    Google "Strongly-typed Enumerations".

    super - damit kann man jetzt natürlich gucken, ob ein wert ein äquivalent im enum hat. oh wait...

    -.-
    Damit kann ein Wert nicht mehr kein äquivalent im Enum haben (weißt du überhaupt, was das ist?), außer man macht explizite Casts (die ich so nie machen würde).



  • Hacker schrieb:

    -.-
    Damit kann ein Wert nicht mehr kein äquivalent im Enum haben (weißt du überhaupt, was das ist?), außer man macht explizite Casts (die ich so nie machen würde).

    Das ist zwar richtig, aber nicht unbedingt für die Problemstellung zielführend. Die Casts können sinnvoll sein, wenn man verschiedene Bitflags abbilden möchte. In diesem Fall kann man die Bitoperatoren für das enum implementieren, welche intern casten.



  • Hacker schrieb:

    Damit kann ein Wert nicht mehr kein äquivalent im Enum haben (weißt du überhaupt, was das ist?), außer man macht explizite Casts (die ich so nie machen würde).

    offenbar geht es dem TE darum - denn sonst bräuchte er diese information nicht. (und anwendungsgebiete gibt es da durchaus. z.bsp. alles, was mit serialisierung zu tun hat)
    wie wärs, wenn du nur in threads postest, in denen du was von interesse posten könntest? mittlerweile mache ich jeden thread mit nem kommentar von dir einfach wieder zu - entweder, du sagst was unpassendes, was falsches oder versuchst irgendwie, deine falsche aussage schön zu reden, wenn es jmd angesprochen hat.


Anmelden zum Antworten