2014-07-24 149 views
-1

考慮下面的枚舉聲明:枚舉初始化後聲明

enum Foo { Bar, Baz, Qux }; 

現在考慮我想統計員(酒吧,巴茲和Qux)有一定的價值。我可以通過簡單地在聲明中初始化他們解決這個問題:

enum Foo { Bar = 4, Baz = 2, Qux = 42 }; 

現在,如果我不想怎麼知道這些價值觀?例如,使用其他庫中的其他預定義值時,或者對兩個統計員使用相同的值時。 Exemples:

enum Foo { Bar = MY_LIB_BAR, Baz = MY_LIB_BAZ, Qux = MY_LIB_QUX }; 
enum Foo { Bar = 0, Baz = 42, Qux = 0 }; 

我想這樣的事情:

// In header 
enum Foo { Bar, Baz, Qux }; 
// In source 
Foo { Bar = 0, Baz = 42, Qux = 0 }; 
// ...or... 
Foo::Bar = 0, Foo::Baz = 42, Foo::Qux = 0; 

顯然,沒有我嘗試做的工作。

所以,我的問題是:有沒有一種方法來初始化它們的聲明之外統計員?如果是這樣,如何做到這一點,例如在一個相應的.cpp源文件中?

編輯:我可以指定我的枚舉的基礎類型。考慮到C++ 11允許前向聲明,我認爲我的問題可以解決,因爲枚舉變成了一個完整的類型。

+0

這些真正的枚舉或者你只是想要一些常量? –

+0

那些必須是枚舉。 – Nelfeal

+0

那麼恐怕你不能做你想做的事。 –

回答

1

這是不可能的。原因很簡單,例如,枚舉通常用在switch聲明中。對於這些語句,必須在編譯時知道這些常量。如果你可以在標題中忽略它們,那麼編譯器將無法編譯另一個ocmpilation單元中的任何switch,因爲它無法訪問這些值。

這同樣適用於所有constexpr S:他們必須定義在那裏它們被宣佈完全相同的原因:編譯器必須始終知道自己的價值。

如果你真的需要躲遠int常量,那麼簡單地定義他們像往常一樣常數,如:

Foo.hpp:

class Foo { 
    static const int Bar; 
    static const int Baz; 
    static const int Qux; 
} 

Foo.cpp中:

const int Foo::Bar = 47; 
const int Foo::Baz = 11; 
const int Foo::Qux = 4711; 

當然,你失去了在switch聲明中使用這些常量的能力!

我可以指定基礎類型我枚舉。考慮到 C++ 11允許前向聲明,我認爲我的問題可能是 ,因爲枚舉變成了一個完整的類型。

這完全沒有幫助!即使在C++ 11和C++ 14中,枚舉常量的前向聲明也是不可能的。

+0

謝謝。我認爲枚舉名稱對於任何用途都是足夠的(例如'switch')。我相信我必須在宣言中留下我醜陋的價值觀。 = / – Nelfeal

0

沒有辦法 - 枚舉總是有initialisers爲enum聲明的一部分,他們不能被分裂出去.cpp文件。這與C++ 11類型的枚舉相同。

0

枚舉是在編譯時計算的常數值,因此可以將其分成聲明和定義像許多其他類型。枚舉聲明也必須是它的定義,所以當你聲明它時,你需要它是完整的值和全部。

+0

由於C++ 11可能提供前向聲明,因此我認爲我的問題也可以解決,因爲我認爲編譯器只需要在代碼使用枚舉器的時候知道枚舉器的名字。 – Nelfeal

+0

@Nelxiost枚舉的前向聲明看起來像'enum Foo;',否則就定義了枚舉。 –

0

枚舉類型是按設計意圖設置的有限集合。