enumの使い方

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
AliceCoder
記事: 51
登録日時: 11年前

enumの使い方

#1

投稿記事 by AliceCoder » 11年前

環境
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などを使うのでしょうか

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

jay
記事: 314
登録日時: 13年前
住所: 大阪市
連絡を取る:

Re: enumの使い方

#2

投稿記事 by jay » 11年前

普通のコンパイラなら何も数値を指定しなかった場合のenumの先頭要素は0にしてくれる筈です
普通じゃないコンパイラを使うからどうしても不安! と言う場合は先頭を0に指定しておけば問題はないかと

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

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

アバター
てんむすキツネ
記事: 88
登録日時: 13年前
住所: 岡山

Re: enumの使い方

#3

投稿記事 by てんむすキツネ » 11年前

自分もまだ勉強中なのですが
初心者は普通じゃないコンパイラには手を出さないと思います。
そして経験者であれば自分のコンパイラが他とは違い、最初の値を0に置き換える必要があることも
わかっているはずだと思います。
MLP!MLP!

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: enumの使い方

#4

投稿記事 by beatle » 11年前

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の一番右に「ダミー」の列挙子を置くのはそれほど悪い考えではないと、僕は思います。

AliceCoder
記事: 51
登録日時: 11年前

Re: enumの使い方

#5

投稿記事 by AliceCoder » 11年前

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

閉鎖

“C言語何でも質問掲示板” へ戻る