Flags in eigenen Namensräumen
-
Hallo.
Ich möchte flags innerhalb einer Klasse und innerhalb von Namensräume kapseln.
Das beste was mir da als Lösung eingefallen ist folgendes:class Klasse { public: struct Eigenschaften { enum { EigenschaftA = 0; EigenschaftB = 0<<0; EigenschaftC = 0<<1; }; }; int eigenschaft; }; Klasse objekt; objekt.eigenschaft |= Klasse::Eigenschaften::EigenschaftB;Gibt es da eine bessere Lösung ohne die Struktur?
Danke für Eure Ratschläge.
-
eigtl nicht(zumindest im aktuellen standard nicht):
(du hast nen paar fehler drin, z.bsp. die semikolons bei dir sind falsch)wieso im name noch mal eigenschaft?
so würd ichs machen:struct enum_name { enum T { A = 0, B = 0<<0, C = 0<<1 }; };das die werte ein wenig sinnlos sind, ist dir bekannt?
das erste element hat btw _immer_ den wert 0...im nächsten standard darf man dann
enum_name::enum_wertschreiben (der msvc konnte das schon immer) - aber im moment ist es nicht standard-konform, wenn man das schreibt - also muss man diesen trick noch ein wenig nutzen^^bb
-
OK, danke.
Echt blöd dass es nicht von vornherein qualifizierte enum-namen gibt.meinte natürlich:
enum { EigenschaftA = 0, EigenschaftB = 1<<0, EigenschaftC = 1<<1, };
-
sqrt(-1) schrieb:
OK, danke.
Echt blöd dass es nicht von vornherein qualifizierte enum-namen gibt.Japp - das hat man jetzt aber gott sei dank endlich auch erkannt und versucht das nachzurüsten : >
der gcc kann das bestimmt auch schon!?ich würd dem enum trotzdem einen namen geben - das schadet nie und oft ist es so gar nötig

so könnte man z.bsp. auch einfach ne fktfuege_eigenschaft_hinzu(enum_name::T wert)schreiben - was ich machen würde
bb
-
unskilled schrieb:
sqrt(-1) schrieb:
OK, danke.
Echt blöd dass es nicht von vornherein qualifizierte enum-namen gibt.Japp - das hat man jetzt aber gott sei dank endlich auch erkannt und versucht das nachzurüsten : >
der gcc kann das bestimmt auch schon!?Der ICC kann es, meckert aber.
ich würd dem enum trotzdem einen namen geben - das schadet nie und oft ist es so gar nötig

so könnte man z.bsp. auch einfach ne fktfuege_eigenschaft_hinzu(enum_name::T wert)schreiben - was ich machen würde
Nur dann kann ich doch keine bit-Operatoren nutzen?
-
sqrt(-1) schrieb:
ich würd dem enum trotzdem einen namen geben - das schadet nie und oft ist es so gar nötig

so könnte man z.bsp. auch einfach ne fktfuege_eigenschaft_hinzu(enum_name::T wert)schreiben - was ich machen würde
Nur dann kann ich doch keine bit-Operatoren nutzen?
das versteh ich nicht...
struct enum_name { enum T { nothing, a = 1<<0, b = 1<<1, default = nothing }; }; #include <iostream> struct foo { public: void add(enum_name::T to_add) { foo_ |= to_add; } void print() { if(foo_ & enum_name::a) std::cout << 'a'; if(foo_ & enum_name::b) std::cout << 'b'; std::cout << std::endl; } foo() : foo_(enum_name::default) {} private: int foo_; }; int main() { foo bar; bar.add(enum_name::a); bar.print(); }so mein ich das...
bb