C++11新特性(81)-有作用域的enum(scoped enumeration)
阿新 • • 發佈:2018-11-01
列舉型別的困惑
從C語言過度到C++以後,列舉作為減少程式錯誤的手段之一被廣泛地使用。但是同時也帶來一個問題:列舉值的重複。假設我們有下面的三原色定義:
程式碼中同時也需要定義三基色:
二者同時定義之後,就會遇到一個問題:red和blue連個值都被重複定義。
傳統的解決方法
修改列舉值的名稱當然是一個方法,只是比較低階,我們就不討論了。一般的做法是將列舉型別的定義放到不同的一個作用域(類或名稱空間)中。例如:
這樣兩個列舉定義就不會發生衝突了。可以用如下方式使用這兩個列舉型別:
略顯繁瑣,但足夠有效。
C++11的解決方式
C++11中引入了限定作用域的列舉型別的概念。其用法如下:
和前面的方式進行比較可以發現:只是在標準的列舉型別定義格式中增加了class關鍵字。它的效果就是為列舉值同時定義了一個和列舉型別同名的作用域。定義了限定作用域的列舉型別之後,可以以如下方式使用:
作者一句話
這種方法即為利用者提供了直接使用Elight型別和EPaint型別的便利,又為列舉值定義提供了自然而然的作用域。雖然簡單,但細思極妙。
示例程式碼下載地址
https://github.com/xueweiguo/OOThinking/blob/master/20180529%20ScopedEnumeration.cpp
覺得本文有幫助?請分享給更多人。
閱讀更多更新文章,請掃描下面二維碼,關注微信公眾號【面向物件思考】