忍者ブログ

神戸電子専門学校ゲームソフト学科の生徒が運営するGESのブログです。

   

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

enumを考える 2年3年向け



どうも、uncleです

明日1年生は3年生の発表会がありますね
かく言う私も発表者の1人なので少し緊張しています

では今回はenumについて少し掘り下げていきたいと思います
え?もう知ってる?
そう言わずちょっとお付き合いください
今回は「enumハック」、「enum class」、「namespace enum」を紹介します


拍手[1回]






と言うことでenumを勉強していきます



■まず初めにenumってなんだっけ?
enumとは列挙型の事で定数をリストにして定義することが出来るというものです
例としては


この様に記述することで定数を宣言できるというものですね
定数は0から始まり、順に1,2,3と言う風に値が変わっていきます
つまりPythonは0、Rubyは3といった具合になります

使い方は

このようにして使用します
rand関数の乱数の質についてはまた機会があれば記事を書きたいと思います。

ここまででは一年生向けの記事ですね、
それでは次にenumハックと言う物を紹介します



これは古いコンパイラが使用されていた時に使用されていた技術らしく
残念ながら最近のC++のソースコードではお目にかかることは少ないかもしれません。
例を上げます。



11行目がenumハックと呼ばれるものになります。
12行目で配列の要素数を指定する為に使用しています

今では
static const int 変数名 = 値;
と記述するでしょう
Javaでは
private static final int 変数名 = 値;
ですね

とは言えこの
static const int 変数名 = 値;
この書き方は以前のコンパイラではエラーを吐いていたようです。
その打開案としてこのenumハックが使用されていたと言うことです。




そして今回の本題に移りましょう。
enumを使用していて名前が被ってしまうなんて事はありませんでしたか?
例えば
 
こんなコードを書いてみました。
enum Animalの初めにDog、
そしてenum Favoriteの3つ目(値は2)にもDogがあります。

23行目、26行目の様な記述をした場合には問題がありません。
ですが問題は24行目、27行目、29行目です。
24行目はエラーになっているため勿論問題ではあるんですが、
何が一番の問題かと言うと29行目にあります。
このコードを書いた私がTest5にAnimal型のDogを代入をしている「つもり」、だった場合にどうなるでしょうか?
今回は変数の宣言しか行っていませんがバグの要因としては十分足り得ますよね
ではどうすればいいのか?

23行目や26行目の様に記述するように自分でルールを決めますか?
それでは△です。
自分で決めたルールはチーム制作では役に立ちません。

ではenumの定数の先頭に何か名前を付随しますか?
それも△です。
個人的にはあまりスマートだとは思いません


ではどうするのか?
そこでC++11で実装された「enum class」,「enum struct」を使用します
enumの後にclassもしくはstructを入れるだけで使用することが出来ます。
例を見てみましょう。
 
enum classとはなんなのか少し理解できたでしょうか?
簡単に説明すると従来のenumの制約を強めたもの。とでも言うのでしょうか、
上記のようにタグ名、スコープ解決演算子を使用しなければ使用できない
それがenum classです。
他にもenum class Animal : charと記述すれば
デフォルトではint型のAnimalの内部型をchar型にすることが出来ます

あとC++11での変更点としては
enum class Animal : char;
と言った感じで前方宣言も可能になったことでしょうか
前方宣言は通常のenumでも可能です


そしてキャストする場合には、

とでもしておけばキャストする際に便利ですね

ですが・・・、これが意外と面倒で
なぜenum classは内部型に暗黙的にキャストしてくれなくなったのかと私的には不満が残ります。
勿論プログラマ側に強制的に明示的なキャストを行わせるというのはバグを減らす為には必要なことだとは思うのですが逐一キャストが必要になると流石にタイプ数も馬鹿になりません。


ですので今回は
・タグ名、スコープ解決演算子の使用を強制させる
・キャストしなくてもいい
そんなenumを紹介します


では例に倣って例をどうぞ

何が変わったのでしょうか?
答えはenumにnamespaceを使用しました
これはstructでも代用が出来ます。
Microsoftではnamespace enumを、
NVIDIAなどではstruct enumを使用しています


では長くなりましたが今回は以上です
お疲れ様でした









PR

COMMENT

NAME
TITLE
MAIL(非公開)
URL
EMOJI
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
COMMENT
PASS(コメント編集に必須です)
SECRET
管理人のみ閲覧できます

ブログ内検索

最新コメント

[01/29 人面犬]
[10/01 8ch]
[09/12 uncle]
[09/10 某卒業生]
[06/07 uncle]

カレンダー

03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

テスト

Copyright ©  -- GESブログ --  All Rights Reserved
Design by CriCri / Photo by Geralt / powered by NINJA TOOLS / 忍者ブログ / [PR]