是否可以将枚举值与声明分开?

时间:2014-01-30 05:57:52

标签: c++ enums

我有一个.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,这是真的。

3 个答案:

答案 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是可行的。我可以想到几种可能的解决方案:

  1. 使用全局静态变量。这意味着您只需要在.h文件中声明变量,并且可以在.cpp文件中定义和初始化它们。

  2. 使用返回值的getter方法创建一个类。

  3. 创建一个getter方法,根据“虚拟”枚举返回“真实”值。

答案 2 :(得分:1)

您可以转发声明enum

class MyClass
{
    enum MyTypes;
};

接着是

enum MyClass::MyTypes
{
    type1 = 12, // ...
};

除了你的类之外,没有人能够使用这些名称,因为它们尚未定义;如果示例中enumprivate,那应该没问题。