2012-06-12 116 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

*運行的封面... *