22 Stimmen

Enum in einem Namespace

Ist es sinnvoll, so etwas zu tun?

namespace status{
  enum status{
    ok,
    error
  };
}

und verwenden Sie es so status::ok

Oder sollte ich dies tun:

enum status{
  status_ok,
  status_error
};

und verwenden Sie es wie folgt status_ok ?

Aktualisierung: Mit C++11 sollten Sie dies nun tun:

enum class status {
    ok,
    error
};

und verwenden Sie es so: status::ok

22voto

Frerich Raabe Punkte 85859

Ich persönlich mag die zweite Variante nicht, weil die status_ Teil scheint mir überflüssig zu sein. Die frühere Version vermeidet dieses Problem, aber mit einem Typ status::status sieht auch seltsam aus. Außerdem ist ein Namensraum offen für Änderungen, falls also jemand etwas wie

namespace status {
  void error( const char *msg );
}

Sie würden einen Compilerfehler erhalten, da die Funktion error kollidiert mit Ihrer enum Wert.

Ich ziehe es vor, eine dritte Variante zu verwenden:

struct MouseButton {
  enum Value {
    Left, Middle, Right
  };
};

Damit kann ich Funktionen schreiben wie

void handleMouseButton( MouseButton::Value b ) {
  switch ( b ) {
    case MouseButton::Left:   // ...
    case MouseButton::Middle: // ...
    case MouseButton::Right:  // ...
  }
}

7voto

neodelphi Punkte 2606

Was Sie wollen, wurde gerade zu C++ hinzugefügt, als die C++0x-Erweiterungen aktiviert wurden. Wenn Sie jedoch keine C++0x-Funktionen verwenden können, empfehle ich Ihnen, dies zu tun:

struct status
{
    enum value
    {
        ok,
        error
    };
};

Mit einer solchen Erklärung können Sie schreiben:

status::value var = status::ok;

Eine solche Struktur ermöglicht es Ihnen auch, Funktionen, die sich auf den Statustyp beziehen, innerhalb der Struktur zu deklarieren. struct Umfang. Zum Beispiel kann der Status struct könnte Methoden zur Konvertierung in/aus einer Zeichenkette enthalten.

4voto

iammilind Punkte 64857

Wenn Sie sich keine Sorgen über die Verwendung von enum status eingeben, dann können Sie es anonym halten.

namespace status{
  enum {  // <--- no name
    ok,
    error
  };
}

1voto

Pieter Punkte 16973

Ich bevorzuge den Namespace-Ansatz, denn er ermöglicht using namespace und die Verwendung der kürzeren Enum-Werte, wenn nur ein Enum in einem Codestück verwendet wird.

Es ist vor allem eine Frage der persönlichen Vorliebe, aber ich denke, dass die Lösung von (potenziellen) Namenskonflikten in C++ am besten mit Namespaces erfolgt, denn das ist der Sinn von Namespaces überhaupt.

1voto

Dan Punkte 12047

Erstens sollten Sie Zugang zu enum s mit Hilfe des Bereichsoperators, :: nicht der Punkt . Operator, d.h. status::ok

Beides ist in Ordnung, es kommt darauf an, was Sie für besser lesbar halten. Sie können auch (ohne das namespace )

enum status{
   ok,
   error
}

und verwenden trotzdem status::ok aber einige Compiler warnen Sie, dass die zusätzliche status:: ist unnötig.

EDIT: Der Zugriff auf eine enum mit :: scheint nur mit MS visual-c++ zu funktionieren

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X