2012-06-03 6 views
12

Aufzählungen in C++ ein großes Problem haben:Wie vermeidet man Namenskonflikte für zwei Enum-Werte mit demselben Namen in C++?

enum Browser 
{ 
    None = 0, 
    Chrome = 1, 
    Firefox = 2 
} 

enum OS 
{ 
    None = 0, 
    XP = 1, 
    Windows7 = 2 
} 

Also, was ist der beste Weg, um dieses Problem in diesem Beispiel zu handhaben: Sie nicht einen Namen in zwei verschiedenen Aufzählungen wie diese haben können?

+1

Wenn die Enumeration spezifisch für eine Klasse ist, platzieren Sie sie in einem (öffentlichen Abschnitt der) Klasse, dann beziehen Sie sich auf die Elemente z. ClassName :: None und OtherClassName :: None. Sie können stattdessen auch die Enums in Namespaces einfügen. Der typische Weg, sie in reinem C zu benennen, ist über Präfixe zu jedem aufgezählten Identifizierer. – pmdj

+0

Meine Frage http://stackoverflow.com/questions/12972317/count-on-enum-c-automatic beantwortet Ihre Frage. – sergiol

+0

Enum-Klassen in C++ 11 scheinen ein guter Versuch zu sein. Aber Sie müssen es nach dem Anwenden von '| – bytecode77

Antwort

27

In C++ 03 Sie innerhalb enum umschließen kann ein struct:

struct Browser 
{ 
    enum eBrowser 
    { 
    None = 0, 
    Chrome = 1, 
    Firefox = 2 
    }; 
}; 

In C++ 11 machen es zu einem enum class:

enum class Browser 
{ 
    None = 0, 
    Chrome = 1, 
    Firefox = 2 
}; 

In C++ 03 namespace als o kann gewickelt werden, aber persönlich finde ich Verpackung struct/class besser, weil namespace ist breiter. z.B.

// file1.h 
namespace X 
{ 
    enum E { OK }; 
} 

// file2.h 
namespace X 
{ 
    enum D { OK }; 
} 
+0

Warum 'struct' und nicht' namespace'? – Pubby

+1

@Pubby, 'namespace' ist auch ok, aber ich finde' struct'/'class'" philosophisch "kompatibler mit' enum class'. – iammilind

+4

@Pubby: Sie können Vorlagen auf 'struct' spezialisieren. –

3

Entweder wickeln Sie sie in Namensräumen oder in Klassen:

namespace Browser { 
    enum BrowserType 
    { 
    None = 0, 
    Chrome = 1, 
    Firefox = 2 
    } 
} 

namespace OS { 
    enum OSType { 
     None = 0, 
     XP = 1, 
     Windows7 = 2 
    } 
} 
12

Eine Möglichkeit ist es, jede Enum in einem anderen Namespace zu setzen:

namespace Foo { 
    enum Browser { 
     None = 0, 
     Chrome = 1, 
     Firefox = 2 
    } 
} 

namespace Bar { 
    enum OS { 
     None = 0, 
     XP = 1, 
     Windows7 = 2 
    } 
} 

Eine bessere Option, wenn mit dem Compiler zur Verfügung, C zu verwenden ist ++ 11 enum classes:

enum class Browser { ... } 
enum class OS { ... } 

Eine Diskussion über Enum-Klassen finden Sie unter here.

1

Wie wäre es mit der Scoped vs. Uncoped Enumeration? C++ 11 bietet jetzt eine Bereichsaufzählung. Ein Beispiel wäre:

enum class Browser : <type> { 

}; 

enum class OS : <type> { 

}; 

Zugriff auf die Aufzählungstypen über ein Objekt des Browsers oder ein Objekt der OS.

2

Sie können enum class (scoped enums) verwenden, die in C++ 11 aufwärts unterstützt wird. Es ist stark typisiert und zeigt an, dass jeder enum Typ unterschiedlich ist.

Browser::None != OS::None 

enum class Browser 
{ 
    None = 0, 
    Chrome = 1, 
    Firefox = 2 
} 

enum class OS 
{ 
    None = 0, 
    XP = 1, 
    Windows7 = 2 
} 
Verwandte Themen