5

我正在使用一个包含多个枚举的类的库。这是一个例子

class TGNumberFormat
{
  public:
  // ...
  enum EAttribute {   kNEAAnyNumber
    kNEANonNegative
    kNEAPositive
  };
  enum ELimit {   kNELNoLimits
    kNELLimitMin
    kNELLimitMax
    kNELLimitMinMax
  };
  enum EStepSize {   kNSSSmall
    kNSSMedium
    kNSSLarge
    kNSSHuge
  };
  // etc...
};

例如,在代码中,我必须引用这些TGNumberFormat::kNEAAnyNumber。我正在编写一个经常使用这些值的 GUI,并且代码越来越难看。有什么方法可以导入这些枚举并输入kNEAAnyNumber?我真的不希望这些名称中的任何一个重叠。我尝试了各种使用using关键字的方法,但都无法编译。

4

4 回答 4

8

如果您在代码中始终使用这些常量,则创建自己的标头以重新定义命名空间中的值可能会有所帮助。然后,您可以using使用该名称空间。您不需要重新定义所有值,只需重新定义枚举数的名称。例如,

namespace TGEnumerators
{
    static EAttribute const kNEAAnyNumber(TGNumberFormat::kNEAAnyNumber);
    // etc.
}

或者,您可以TGNumberFormat在经常使用它的函数或源文件中将其键入更短的名称。例如,

typedef TGNumberFormat NF;
NF::EAttribute attribute = NF::kNEAAnyNumber;

我认为后一种方法更优越,如果在块范围内明智地使用,是一种很好的做法。但是,对于跨文件使用,为了清楚起见,我认为最好使用枚举数的全名。

于 2012-06-12T19:41:18.677 回答
0

另一种可能但需要更多前期工作的方法是定义一批 const,然后您可以使用它们:

例如

const TGNumberFormat::EAttribute AnyNumber = TGNumberFormat::kNEAAnyNumber;
const TGNumberFormat::EAttribute NonNegative = TGNumberFormat::kNEANonNegative;
...

attribute = AnyNumber;
于 2012-06-12T20:20:04.910 回答
0

两种解决方案:

  1. 忍受它。
  2. #define AnyNumber TGNumberFormat::kNEAAnyNumber

*为掩护而奔跑……*

于 2012-06-12T21:23:13.410 回答
0

如果您使用 c++11,您可以使用关键字 auto 来推断类型:

//the compiler will see auto and know to use: TGNumberFormat::EAttribute
auto attribute = TGNumberFormat::kNEAAnyNumber;

编译:g++ -std=c++0x -o main main.cpp

如果您不使用 c++11,请考虑使用@James McNellis 提到的 typedef,
不推荐使用宏,因为它们不遵守范围规则 - typedef 会。

于 2012-06-12T19:55:08.460 回答