我有一个.h文件:
class MyClass
{
enum MyTypes{
type1 = 1,
type2 = 2,
type3 = 3,
// and so on
};
};
是否可以将此声明中的“= value”分隔到另一个位置,即相关的cpp文件?原因是此枚举具有由我无法控制的远程服务器提供的奇怪值。我想将它从客户的眼中移除。
我想要一个带
的.cpp文件enum MyClass::MyTypes{
type1 = 12,
type2 = 14,
type3 = 28,
// and so on
};
但是编译器说我重新定义MyTypes,这是真的。
答案 0 :(得分:4)
为证实chris的评论,C ++ 11允许您转发声明枚举。以下代码将在C ++ 03中失败,但在C ++ 11中编译:
struct S {
enum E : int;
};
enum S::E : int {
a,b,c
};
N2764以及Forward declaring an enum in c++会详细介绍,但是:
enum无法向前声明的原因是不知道 这些值,编译器无法知道枚举所需的存储空间 变量
enum class
不需要这样做,因为默认类型是int。
“解决方法”是转发声明包含枚举的结构。积分转到Leszek Swirski。注意:可变参数宏是C ++ 03中的gcc扩展名。
#define ENUM_CLASS(NAME, TYPE, VALUES...) \
struct NAME { \
enum e { VALUES }; \
explicit NAME(TYPE v) : val(v) {} \
NAME(e v) : val(v) {} \
operator e() const { return e(val); } \
private:\
TYPE val; \
}
struct Enum;
void f(Enum e);
ENUM_CLASS(Enum, int,
VALUE,
ANOTHER_VALUE
);
void f (Enum e)
{
switch(e)
{
case Enum::VALUE:
std::cout << "VALUE" << std::endl;
return;
case Enum::ANOTHER_VALUE:
std::cout << "ANOTHER_VALUE" << std::endl;
return;
}
}
f(Enum::ANOTHER_VALUE);
答案 1 :(得分:3)
我不认为使用enum
是可行的。我可以想到几种可能的解决方案:
使用全局静态变量。这意味着您只需要在.h文件中声明变量,并且可以在.cpp文件中定义和初始化它们。
使用返回值的getter方法创建一个类。
创建一个getter方法,根据“虚拟”枚举返回“真实”值。
答案 2 :(得分:1)
您可以转发声明enum
:
class MyClass
{
enum MyTypes;
};
接着是
enum MyClass::MyTypes
{
type1 = 12, // ...
};
除了你的类之外,没有人能够使用这些名称,因为它们尚未定义;如果示例中enum
为private
,那应该没问题。