2012-06-12 51 views
5

我正在使用具有多个枚举的类的库。这里有一个例子使用类的枚举(C++)

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

我会用一个typedef本地的功能(如:'的typedef TGNumberFormat NF;',允许,比如:'NF :: kNELLimitMin') 。尽管如此,我认为最好输出名称。 –

+0

'struct X:TGNumberFormat {};'。然后你可以使用它们作为'X :: kNEAAnyNumber'。我不建议你这么做,因为'TGNumberFormat'(表面上)比''''提出的更短的名称具有更多的意义。 – Praetorian

回答

8

如果您在代码中全部使用这些常量,那么创建自己的头可能会有所帮助,从而重新定义名称空间中的值。那么你可以使用using那个命名空间。你不需要重新定义所有的值,只需要枚举者的名字。例如,

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

或者,你可以的typedef TGNumberFormat在功能或者你经常使用它的源文件较短的名称。例如,

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

我认为,后一种方法是优越的,并且如果在块范围明智地使用,是一个很好的做法。但是,为了清楚起见,为了在文件中使用,我认为最好使用枚举器的全名。

+0

+1我不记得有多少次我看过一个普通的枚举器,并想知道它来自哪里,因为它被一个鬼鬼祟祟的'typedef'或'using'隐藏起来。 –

+1

只需稍加说明:对于值重定义(您的第一个方法),我认为最好使用'static const EAttribute'而不是普通的'EAttribute'。 – Synxis

+0

在命名空间的作用域是什么让它成为'static'? –

0

如果您使用C++ 11,你可以使用关键字自动推断类型:

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

编译:G ++ -std =的C++ 0x -o主要的main.cpp

如果你不使用C++ 11,如@詹姆斯McNellis
使用宏提到的不推荐,因为他们不会听从会scope--类型定义的规则,可以考虑使用类型定义。

0

这是可能的,但涉及到多一点的工作,前面是定义一个批次consts,你再使用,而不是另一种方式:

例如

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

attribute = AnyNumber; 
0

两个解决方案:

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

*运行的封面... *