2012-05-23 24 views
0

假設我正在構建一個簡單的類,它可以在屏幕上打印一些文本,並且可以更改文本的顏色。使用枚舉類型用戶界面功能是一個好主意?

myclass a("this is the text"); 
a.setColor("green"); 

我還在學習C++和最近我介紹給enum我想我會試試看。我想知道在上述setColor之類的接口功能中使用enum類型是否是一種好的做法?

在接口函數中使用enum類有哪些優缺點?有沒有比它們更適用的情況,以及是否存在不適用的情況?

如果我想結合屬性該怎麼辦?例如。

a.setAttribute("bold reverse"); 

我不知道,如果接口是正確的術語,我想描述:我的類的用戶將最終使用的功能。

回答

8

在你的情況,有(至少)兩個優點:

  • 無需解析字符串在運行時,從而導致更高的效率。您可以直接在switch語句中使用枚舉變量。
  • 枚舉(在某種程度上)是自我記錄,您的代碼的用戶必須努力工作以提供無效值。

一個潛在的「缺點」是在顏色串來自例如,運行時用戶輸入(他們已經輸入到文本框或其他東西)。您將需要解析此字符串並將其轉換爲枚舉。但這並不是一個壞處,因爲無論如何你都需要這樣做。最佳做法是讓用戶界面邏輯驗證字符串並儘早將其轉換爲枚舉。

如果我想合併屬性,該怎麼辦?

我能想到的至少有三個辦法:

  • 使用多次調用setAttribute
  • 傳遞一組屬性。
  • 將每個枚舉值定義爲二的冪,然後可以將枚舉與|結合使用。
+0

可以用強類型的方法完成後一種方法嗎? – romeovs

+0

@romeovs:我不這麼認爲。因此,我不那麼熱衷於這種選擇。 –

+0

我使用'std :: initializer_list '來解決這個問題! – romeovs

3

是的,在這種情況下使用enum似乎比實際的字符串更好。

一個明顯的優勢 - 強大的打字。

如果setColor接受你的情況下char*一樣,你可以這樣做:

a.setColor("horse"); 

您只能檢測在運行時錯誤。

如果setColor需要一個eColors作爲參數:

a.setColor(eGreen); 
a.setColor(eRed); 

將編譯,但

a.setColor(eHorse); 

不會。

0

在這種情況下,枚舉肯定比字符串更加明確。至於值的串聯,你可以使用一些小工具來完成這個工作。將你的枚舉的值設置爲增加2的冪,然後你可以將它們放在一起。

enum TextAttributes { 
    Bold = 1, 
    Italic = 2, 
    Reverse = 4, 
    StrikeThrough = 8, 
    Underline = 16 
}; 

TextAttributes attr = Bold | Reverse; 
+0

使用這種方法,我不能使用枚舉類嗎?這意味着不是強類型? – romeovs

+0

正確。這種方法無法使用開關。 – JamesWynn

+0

@romeovs可以使用範圍枚舉:您可以爲它們重載按位運算符。這*表示很多樣板,但可以重構以便重複使用。 –

相關問題