ページ 11

enumの使い方

Posted: 2012年12月05日(水) 00:05
by AliceCoder
環境
Windows7 64bit
VC++

C++でプログラミンングしていて気になったのですが、
クラスのメンバ関数ポインタhito_func[]を宣言するとして
enumの要素の数だけ配列を確保したい場合はどのようにするのが最善なのでしょうか

コード:

class Sample{
    enum Hito{JON, AN, MAY, HITO_KAZU};
    void (Sample::*hito_func[HITO_KAZU])(void);
};
上記のようなコードを使っていますが、何か問題がありそうでこのままでいいのかと思い質問させてもらいました
コンパイラによってenumの左からの値が違うとかあるんですかね。それと可読性としてはどうなんでしょうか。
自分では見やすくても他人がenumの最後のところに違う定数を追加してしまう可能性があるのは分かるのですが・・・
経験者の方はこういうときどうするのでしょうか
constやマクロを使って要素数を定義するのでしょうか
配列をそもそも使わずにVecterなどを使うのでしょうか

いろいろな方の意見を聞きたいです

Re: enumの使い方

Posted: 2012年12月05日(水) 01:52
by jay
普通のコンパイラなら何も数値を指定しなかった場合のenumの先頭要素は0にしてくれる筈です
普通じゃないコンパイラを使うからどうしても不安! と言う場合は先頭を0に指定しておけば問題はないかと

可読性の方はどうでしょうね
ある程度経験のある人ならば問題ないレベルだと思いますよ

僕ならばAliceCoderさんがおっしゃるようにconstで要素数を定義しますね
それが正解なのかどうかは分かりませんし、最善のやり方なのかどうかもわかりませんけどねw
(と言うかその時々によって最善は変わると思いますけど)

Re: enumの使い方

Posted: 2012年12月05日(水) 05:32
by てんむすキツネ
自分もまだ勉強中なのですが
初心者は普通じゃないコンパイラには手を出さないと思います。
そして経験者であれば自分のコンパイラが他とは違い、最初の値を0に置き換える必要があることも
わかっているはずだと思います。

Re: enumの使い方

Posted: 2012年12月05日(水) 07:40
by beatle
enumの定数名(列挙子名)を配列のインデックスに使おう、というのが、そもそもenumの考え方と食い違っています。
enumは本来、特定の整数とは結びつかない定数名を作るものです。
enumと整数型の相互変換をしようとする時点で、enumの概念から外れているのです。

さて、その上であえてenumを配列のインデックスにすることを考えます。
まず、enumの一番左の列挙子名が、明示的に値を与えない場合は 0 になることは規格で保証されています。
明示的に値を与えたい場合は、 = を使って値を指定できます。

enumの一番右の列挙子名を、列挙子の数を表すと思って良いのかという議論ですが、明示的に値を与えない場合はOKでしょう。
しかし以下のコードは当然だめですね。

コード:

class Sample{
    enum Hito{JON, AN, MAY=100, HITO_KAZU};
    void (Sample::*hito_func[HITO_KAZU])(void);
};
人は3人ですけれども、HITO_KAZUは101になってしまいます。

このような明示的な値の割り当てを行わない限り、enumの一番右に「ダミー」の列挙子を置くのはそれほど悪い考えではないと、僕は思います。

Re: enumの使い方

Posted: 2012年12月05日(水) 21:17
by AliceCoder
たくさんの回答ありがとうございました
考えた結果enumの最後に大きさを定義するのはやめておこうと思います
constなどを普段は使っていこうと思います
今回はクラスのメンバ配列の要素数なので、最近ググって知ったenumハックとやらを使って大きさを定義していきたいと思います