C++ 使用类(C+;+;)中的枚举
我使用的是一个库,它有很多枚举类。这里有一个例子C++ 使用类(C+;+;)中的枚举,c++,enums,C++,Enums,我使用的是一个库,它有很多枚举类。这里有一个例子 class TGNumberFormat { public: // ... enum EAttribute { kNEAAnyNumber kNEANonNegative kNEAPositive }; enum ELimit { kNELNoLimits kNELLimitMin kNELLimitMax kNELLimitMinMax }; enum EStepSiz
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
关键字,但是没有一种方法可以编译。如果您在代码中使用这些常量,那么创建自己的头来重新定义名称空间中的值可能是有益的。然后可以使用该命名空间。您不需要重新定义所有的值,只需要重新定义枚举数的名称。比如说,
namespace TGEnumerators
{
static EAttribute const kNEAAnyNumber(TGNumberFormat::kNEAAnyNumber);
// etc.
}
typedef TGNumberFormat NF;
NF::EAttribute attribute = NF::kNEAAnyNumber;
或者,您可以在经常使用的函数或源文件中,将defTGNumberFormat
键入为较短的名称。比如说,
namespace TGEnumerators
{
static EAttribute const kNEAAnyNumber(TGNumberFormat::kNEAAnyNumber);
// etc.
}
typedef TGNumberFormat NF;
NF::EAttribute attribute = NF::kNEAAnyNumber;
我认为后一种方法更优越,如果在块范围内明智地使用,是一种很好的实践。但是,为了在文件中使用,为了清楚起见,我认为最好使用枚举数的全名。如果您使用c++11,则可以使用关键字auto来推断类型:
//the compiler will see auto and know to use: TGNumberFormat::EAttribute
auto attribute = TGNumberFormat::kNEAAnyNumber;
编译时使用:g++-std=c++0x-o main.cpp
如果您不使用C++ 11,请考虑使用@ James McNellis
不建议使用宏,因为它们不会遵守作用域规则——typedefs会遵守。另一种可能的方法是定义一批常量,然后改用:
e、 g
两种解决方案:
接受它
#定义AnyNumber TGNumberFormat::kNEAAnyNumber
*运行cover…*我将使用函数的本地typedef(例如typedef TGNumberFormat NF;
,例如允许NF::kNELLimitMin
)。不过,我认为最好键入名称。struct X:TGNumberFormat{}代码>。然后可以将它们用作X::kNEAAnyNumber
。我不建议您这样做,因为TGNumberFormat
(表面上)比你为X
+1想出的任何更短的名字都有更多的意义。我记不清有多少次我见过一个裸露的枚举器,并且想知道它到底从哪里来,因为它被一个鬼鬼祟祟的typedef
或使用的隐藏了起来。只是一句小小的注释:对于值重新定义(你的第一种方法),我认为最好使用static const EAttribute
而不是普通的EAttribute
@Mark来明确链接是内部的。代码没有必要工作,但我认为它更自我描述。