2011-12-01 59 views
1

結構如下:訪問在一個結構中定義的枚舉值

struct padData 
{ 
    enum buttonsAndAxes 
    { 
     select, 
     start, 
     ps 
    }; 
}; 

結構的目的:

padData  pad; 

我訪問該枚舉如下:

printf ("\n%d", pad.buttonsAndAxes[0]); 

錯誤:

error: invalid use of ‘enum padData::buttonsAndAxes’ 

然後,我想:

printf ("\n%d", pad::buttonsAndAxes[0]); 

錯誤:

error: ‘pad’ is not a class or namespace 

現在怎麼辦?請指導。

編譯:GCC 4.5.0版

編輯1: _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __

printf ("\nemit: %d", padData::(select)0); 

結果:

error: expected unqualified-id before ‘(’ token 

我的目標是獲取單詞 「選擇」,通過它的值0 。如何實現這一目標?另外,單詞「選擇」一個字符串?

+0

你想要打印「0」或「選擇」? –

+0

@ R.MartinhoFernandes感謝您的回覆,我想爲該語句提供0並獲得結果「select」。即我想打印選擇。 –

+1

哦,這需要手工完成:(也就是說,你需要用值和相應的字符串做一個表格,下面是一個類似的問題:http://stackoverflow.com/questions/3342726/c-print- out-enum-value-as-text –

回答

2

枚舉值成爲該類範圍中的名稱。所以你會從課堂外使用padData::select,或者從課堂內部使用select

在C++ 11中,您可以使用enum的名稱來限定枚舉器,從外部給予padData::buttonsAndAxes::select,從裏面給予buttonsAndAxes::select


打印枚舉的名稱不容易在C++中完成的,因爲名字編譯後消失。您需要設置一個表格,將這些值映射到它們的字符串。如果你沒有在你的例子提供明確的值一樣,你可以簡單地使用數組:

enum buttonsAndAxes 
{ 
    select, 
    start, 
    ps 
}; 

const char* buttonsAndAxesNames[] = { 
    "select", 
    "start", 
    "ps" 
}; 

然後你索引到該數組:如果你想要一些更復雜的方法

printf("%s", buttonsAndAxesNames[select]); 

,你可以在previousquestions找到一堆技巧。

+0

試過了,不起作用:'printf(「\ n」,pad :: select);'產生'錯誤:'pad'不是類或名字空間' –

+0

@Anisha:'padData'!班級的名字。 –

+0

'錯誤:'padData :: buttonsAndAxes'不是一個類或名稱空間'這也不起作用。順便說一句,我是從一個班級裏面訪問這個。 –

2
 
printf ("\n%d", padData::select); 

枚舉不是數組,它使用時沒有索引。

+0

謝謝。這樣可行。 –

1

ENUMS主要用於代碼的更好的可讀性,而不是計算輔助器。除非另有說明,否則ENUMS主要是賦值爲0,1,2等的文字。所以你應該總是以「::」資格使用它們而不是數組

1

你似乎需要一本好的C++書籍。

枚舉,在C和C++,是一種方便的方式:

  • 的積分值映射到 「智能」 名稱
  • 組內屬於一起

語法一起值非常簡單(在C++ 03中):

enum <enum-name> { 
    <value-name-0> [= <value-0>], 
    <value-name-1> [= <value-1>], 
    ... 
}; 

其中:

  • <enum-name>是的類型被引入
  • <value-name-X>的名稱枚舉
  • <value-X>的值的名稱被提供給名稱的值,並且是可選的

如果沒有賦予某個名稱的值:

  • 如果它是fi首先,它被設置爲0
  • 否則,它被設置爲以前的名稱的值,+ 1

這裏是一個小例子演示如何使用枚舉:

enum Color { 
    Blue, 
    Green, 
    Red 
}; 

char const* name(Color c) { 
    switch(c) { 
    case Blue: return "Blue"; 
    case Green: return "Green"; 
    case Red: return "Red"; 
    } 
    assert(0 && "Who stored crap in my enum ?"); 
} 

這說明一次幾個重點:

  • Color,像STRU ct類型或類類型。它可以被typedefed和所有。
  • an enum「value-name」是一個積分常量,它可以用作模板參數或切換情況。
  • an enum「value-name」被注入到聲明該類型的作用域中,而不是嵌套在其中。(C++ 11允許範圍與enum class語法值)
  • 別的東西完全可以被存儲在enum,而這不應該發生在表現良好的應用程序,你可以通過鑄造做到這一點...

什麼不顯示,是一個enum是一個純粹的整數。確切的底層類型雖然由編譯器決定。在這個選擇中有幾條規則,對你來說應該沒有問題,你應該知道的是,所選擇的類型足夠寬以包含枚舉的所有值(並且如果需要,可能需要簽名)。它意味着選擇的類型不一定是普通的int

因此:printf("%d", Green);是一個編程錯誤。它應該是printf("%d", (int)Green);

另一個重要的問題是,枚舉名稱不會出現在最終的二進制文件中。名稱直接替換它們的值,根本沒有運行時間開銷。調試器通常會從調試信息中檢索名稱(如果可用),並在向您提供信息時將其替換回來。