Im folgenden Codeausschnitt wird die Color
Aufzählung innerhalb der Car
Klasse deklariert , um den Umfang der Aufzählung einzuschränken und zu versuchen, den globalen Namespace nicht zu "verschmutzen".
class Car
{
public:
enum Color
{
RED,
BLUE,
WHITE
};
void SetColor( Car::Color color )
{
_color = color;
}
Car::Color GetColor() const
{
return _color;
}
private:
Car::Color _color;
};
(1) Ist dies ein guter Weg, um den Umfang der Color
Aufzählung einzuschränken? Oder sollte ich es außerhalb der Car
Klasse deklarieren , aber möglicherweise innerhalb ihres eigenen Namespace oder seiner eigenen Struktur? Ich bin heute gerade auf diesen Artikel gestoßen, der sich für Letzteres einsetzt und einige nette Punkte zu Aufzählungen bespricht: http://gamesfromwithin.com/stupid-c-tricks-2-better-enums .
(2) Ist es in diesem Beispiel am besten , wenn Sie innerhalb der Klasse arbeiten, die Aufzählung als zu codieren Car::Color
oder würde dies nur Color
ausreichen? (Ich gehe davon aus, dass Ersteres besser ist, nur für den Fall, dass Color
im globalen Namespace eine andere Aufzählung deklariert ist. Auf diese Weise geben wir zumindest die Aufzählung an, auf die wir uns beziehen.)
Car::Color getColor()
abervoid Car::setColor(Color c)
weil in habensetColor
wir schon den spezifizierer.Heutzutage können Sie mit C ++ 11 die Enum-Klasse dafür verwenden:
AFAII das macht genau das was du willst.
quelle
Ich bevorzuge den folgenden Ansatz (Code unten). Es löst das Problem der "Namespace-Verschmutzung", ist aber auch viel typsicherer (Sie können nicht zwei verschiedene Aufzählungen oder Ihre Aufzählung mit anderen integrierten Typen usw. zuweisen und sogar vergleichen).
Verwendung:
Ich erstelle ein Makro, um die Verwendung zu erleichtern:
Verwendung:
Einige Referenzen:
quelle
if(c2 == Color::Red )
ist vernünftig und muss kompiliert werden, aber in Ihrem Beispiel nicht. Gleiches Argument für die Zuweisung auch!c2
ist von einem anderen Typ (Color2
). Warum sollten alsoc2 == Color::Red
Aufgaben kompiliert werden? WasColor::Red
ist, wenn 1 undColor2::Red
2 ist? SollteColor::Red == Color2::Red
zutrue
oder bewertenfalse
? Wenn Sie nicht typsichere Enumeratoren mischen, werden Sie eine schlechte Zeit haben.Im Allgemeinen schreibe ich meine Aufzählungen immer in a
struct
. Ich habe mehrere Richtlinien gesehen, einschließlich "Präfix".Ich habe immer gedacht, dass dies eher nach
C
Richtlinien als nach RichtlinienC++
aussieht (zum einen wegen der Abkürzung und auch wegen der Namespaces inC++
).Um den Umfang einzuschränken, haben wir jetzt zwei Alternativen:
Ich persönlich neige dazu, a zu verwenden,
struct
da es als Parameter für die Vorlagenprogrammierung verwendet werden kann, während ein Namespace nicht manipuliert werden kann.Beispiele für Manipulationen sind:
Dies gibt die Anzahl der Elemente von enum innerhalb der Struktur zurück
T
:)quelle
Wenn Sie eine Codebibliothek erstellen, würde ich den Namespace verwenden. Sie können jedoch immer noch nur eine Farbaufzählung in diesem Namespace haben. Wenn Sie eine Aufzählung benötigen, die möglicherweise einen gemeinsamen Namen verwendet, jedoch unterschiedliche Konstanten für unterschiedliche Klassen aufweist, verwenden Sie Ihren Ansatz.
quelle