Я использую для этого вложенные пространства имен. Мне они нравятся больше, чем помещать перечисление в класс, потому что вне класса вы должны использовать полное использование MyClass :: MyEnum, даже если MyEnum не собирается конфликтовать с чем-либо еще в области видимости.
Используя вложенное пространство имен, вы можете использовать синтаксис «using». Также я помещу перечисления, которые относятся к данной подсистеме, в их собственный файл, чтобы у вас не возникало проблем с зависимостью от необходимости включать мир для их использования.
Итак, в заголовочном файле enum вы получите:
// MyEnumHeader.h
// Consolidated enum header file for this dll,lib,subsystem whatever.
namespace MyApp
{
namespace MyEnums
{
enum SomeEnum { EnumVal0, EnumVal1, EnumVal2 };
};
};
И тогда в заголовочном файле класса вы получите:
// MyInterfaceHeader.h
// Class interfaces for the subsystem with all the expected dependencies.
#include "MyEnumHeader.h"
namespace MyApp
{
class MyInterface
{
public:
virtual void DoSomethingWithEnumParam (MyEnums::SomeEnum enumParam) = 0;
};
};
Или используйте столько заголовочных файлов enum, сколько имеет смысл. Мне нравится держать их отдельно от заголовков классов, чтобы перечисления могли быть параметрами в других частях системы без необходимости использования заголовков классов. Затем, если вы хотите использовать их где-то еще, вам не нужно иметь определения инкапсулирующего класса, как если бы перечисления были объявлены внутри классов.
И, как упоминалось ранее, во внешнем коде вы можете использовать следующее:
using namespace MyApp::MyEnums;