enum und Konstanten äquivalent (?)
-
Sind die folgenden beiden codestücke zu 100% gleichwertig:
enum Element{ px = 0, py = 1, pz = 2, u = 3 };und:
const int px = 0; const int py = 1; const int pz = 2; const int u = 3;Besteht der Sinn von enum nur darin, dass man weniger schreiben muss, wenn man einmal besonders viele Konstanten braucht, kann ich das sozusagen als 'Abkürzung' betrachten in solchen Fällen, oder gibt's dabei Besonderheiten oder Probleme die passieren könnten, wenn ich ein enum einfach nur als Konstantenliste ansehe ? Sind enum-Konstanten ein ebensoguter Ersatz für #define Anweisungen wie gewöhnliche const-Konstanten ?
-
Ein enum kann etwas mehr. Wenn du in ein enum Werte reinstopfst dann mußt du keine Zahlen dazu schreiben, jedes Element nimmt automatishc den Wert des vorhergehenden+1 an, außer man weist ihnen wie du explizite werte zu, dh das hier wäre ausreichend gewesen:
enum Element{ px, py, pz, u };Außerdem sind alle Inhalte des enum über den :: operator erreichbar sofern das enum einen Namen hat, außerdem kannst du bei Funktionen als Argument eine Variable des Typs deines enum erwarten
void myfunc(Element ele);
-
Für Konstanten nimmt man eigentlich eher
const. Wenn man diese gleich mit Literalen initialisiert, sind die Werte schon zur Kompilierzeit bekannt.Enumerationen sind Aufzählungen und verfolgen ein weiteres Konzept: Einem Typen eine genau definierte Anzahl Zustände mit gewisser Compiletime-Typsicherheit zu erlauben.
enum Color { Green, Pink, Orange }; Color c = Pink; // Initialisierung mit Enumerator c = 3; // Zuweisungen von Zahlen funktionieren nichtEinfach2 schrieb:
Besteht der Sinn von enum nur darin, dass man weniger schreiben muss, wenn man einmal besonders viele Konstanten braucht, kann ich das sozusagen als 'Abkürzung' betrachten in solchen Fällen
Nein, das auf keinen Fall. Wie gesagt kann
enumfür eine Sammlung von zusammengehörigen Zuständen verwendet werden.Einfach2 schrieb:
oder gibt's dabei Besonderheiten oder Probleme die passieren könnten, wenn ich ein enum einfach nur als Konstantenliste ansehe ?
Probleme sollte es eigentlich keine geben. Ich persönlich nehme aber lieber
const, wenn es sich um Konstanten handelt, undenum, wenn Aufzählungen benötigt werden. Das ist für mich eine klarerer Trennung.Einfach2 schrieb:
Sind enum-Konstanten ein ebensoguter Ersatz für #define Anweisungen wie gewöhnliche const-Konstanten ?
#definefür Konstanten hat in C++ eigentlich nicht viel zu suchen (dazu gab es hier einige Threads). Da wärenconst-Variablen der massiv bessere Ersatz.Xebov schrieb:
Außerdem sind alle Inhalte des enum über den :: operator erreichbar sofern das enum einen Namen hat
Die Enumeratoren werden leider immer in den umliegenden Namensraum ausgeleert (mit
enum classim neuen Standard wird das besser). Ich bin mir an dieser Stelle nicht ganz sicher, aber ich glaube, es ist nicht standardkonform, Enumeratoren über den Scope-Operator anzusprechen.
-
Nexus schrieb:
Die Enumeratoren werden leider immer in den umliegenden Namensraum ausgeleert (mit
enum classim neuen Standard wird das besser). Ich bin mir an dieser Stelle nicht ganz sicher, aber ich glaube, es ist nicht standardkonform, Enumeratoren über den Scope-Operator anzusprechen.Ja das ausleeren ist ein echtes Ärgerniss damit ärgere ich mich schon den ganzen tag herum, ich glaub ich werd meine in nen eigenen namespace schieben damit ruhe ist. Zugriff über den Scope Operator Funktioniert in VC++ ich glauba ber das gehört zum neuen Standard.
-
Xebov schrieb:
Ja das ausleeren ist ein echtes Ärgerniss damit ärgere ich mich schon den ganzen tag herum, ich glaub ich werd meine in nen eigenen namespace schieben damit ruhe ist.
Ein eigener Namensraum oder eine Klasse um den
enumist ein üblicher Workaround. Aber ganz sauber ist er trotzdem nicht...Xebov schrieb:
Zugriff über den Scope Operator Funktioniert in VC++ ich glauba ber das gehört zum neuen Standard.
"Funktioniert" würde ich relativieren, man erhält mit MSVC++ eine Compilerwarnung:
warning C4482: Nicht dem Standard entsprechende Erweiterung: Enumeration "Color" wird im qualifizierten Namen verwendet.
-
Nexus schrieb:
Ein eigener Namensraum oder eine Klasse um den
enumist ein üblicher Workaround. Aber ganz sauber ist er trotzdem nicht...Naja man gibt ihm einafchd en selben Namen wie dem enum dann kann man ihn mit dem neuen Standart wegmachen.
Nexus schrieb:
"Funktioniert" würde ich relativieren, man erhält mit MSVC++ eine Compilerwarnung:
warning C4482: Nicht dem Standard entsprechende Erweiterung: Enumeration "Color" wird im qualifizierten Namen verwendet.
Naja es ist ja nur ne warnung, die Frage ist ja ob es damit wirklich schon richtig Funktioniert.
-
Nur zur Verdeutlichung:
Vollqualifizietrer Zugriff:
enum A { B, C }; // Zugriff: A a = A::B; // erzuegt WarnungWorkaround mit Namespace:
namespace A { enum E { B, C }; } // Zugriff: A a = A::B; // erzuegt keine WarnungScheint mir Xebov brachte was durcheinander.
SimonEdit:
BTW, das hat nichts mit neuen Standard zu tun.
-
theta schrieb:
BTW, das hat nichts mit neuen Standard zu tun.
Nicht, habe ich dan das hier falsch verstanden?
http://en.wikipedia.org/wiki/C%2B%2B0x#Strongly_typed_enumerations
(ich meine den text unter dem 3. Beispiel)