質問

この列挙型があります:

enum ButtonState {
    BUTTON_NORMAL = 0,
    BUTTON_PRESSED = 1,
    BUTTON_CLICKED = 2
};

const u8 NUM_BUTTON_STATES = 3;

Buttonクラスには、メンバー変数 ButtonState state; および ButtonColors colors [NUM_BUTTON_STATES]; があります。ボタンを描画するときは、 colors [state] を使用して、ボタンの状態に関係なく色を取得します。

私の質問:

  1. これは良いプログラミングスタイルですか?それを行うより良い方法はありますか? (私は通常、switchステートメントで列挙型のみを使用します...配列インデックスとして列挙型を使用するのは適切ではありません。)
  2. enumの値を指定する がありますか?デフォルトでは0から始まり1ずつ増加するようですが、すべてのコンパイラでそのように動作することが保証されていますか?
役に立ちましたか?

解決

これは良いプログラミングスタイルですか?

そう思います。同じことをかなり頻繁に行います。

より良い方法はありますか

class Button
{
public:
    // Used for array indexes!  Don't change the numbers!
  enum State {
    NORMAL = 0,
    PRESSED,
    CLICKED,
    NUMBER_OF_BUTTON_STATES
  };
};

欠点は、 NUMBER_OF_BUTTON_STATES が有効な Button :: State 値になったことです。これらの値を ints として渡す場合、大きな問題ではありません。しかし、実際に Button :: State を期待している場合は問題があります。

enumを配列インデックスとして使用するのは適切ではありません。

大丈夫です。 DOCUMENT だけで、次の人は何が起こっているのか知っています! (それがコメントの目的です。)

列挙の値を指定する必要がありますか

「=」を割り当てない場合、enumの は0から始まり、上に向かって増加します。

enumエントリに「=」が割り当てられた値がある場合、後続の「=」以外のenumエントリはそこからカウントを続けます。

出典:注釈付きC ++リファレンスマニュアル、113ページ

とはいえ、コードをより明確にするためだけに初期値を指定するのが好きです。

他のヒント

はい、うまくいきます。とはいえ、いずれにしても、アイテムの量の値を定義する別のエントリを列挙に追加する必要があります。

enum ButtonState {
    BUTTON_NORMAL,
    BUTTON_PRESSED,
    BUTTON_CLICKED,
    STATE_COUNT
};

次のように配列を定義できます

Color colors[STATE_COUNT];
そうでなければ、状態の量を配列のサイズと同期させておくのは面倒です。列挙は、初期化されていない場合は常にゼロで始まり、初期化されていない場合、追加の各エントリには前のエントリより1つ上の値が割り当てられます。もちろん、必要に応じて明示的にゼロを設定しても問題はありません。追加のコードを気にしない場合は、次のような関数を使用して生の配列へのアクセスをラップします

Color & operator[](ButtonState state) {
    return array[state];
}

または同等の getColor 関数がリクエストを転送します。これは、ある整数で配列に直接インデックスを付けることを禁止しますが、インデックスを間違えるとほぼ間違いなく失敗します。

enumを使用しても問題ありません。ただし、すべてのアイテムに値を指定する必要はありません。最初の値を指定するだけで十分です。私は1を開始値として使用したコンパイラを使用したため、列挙型が0で始まるとは想定していません(PC用ではなく、マイクロコントローラ用のコンパイラには奇妙な動作があります)。 また、constを取り除くこともできます。

enum ButtonState {
    BUTTON_NORMAL = 0,
    BUTTON_PRESSED,
    BUTTON_CLICKED,
    NUM_BUTTON_STATES
};

質問1:良いプログラミングスタイルだと思います。いつも使っています。 質問2:私の知る限り、そのように動作することが保証されているため、値を指定する必要はありません。

そして、NUM_BUTTON_STATESも列挙に入れます。

スタイルに関しては、それで十分です。

Delphiのようなパスカルベースの言語では、配列の境界を列挙型として指定できるため、その特定の型の項目のみをインデックスとして使用できます。

enumを使用して配列のインデックスを作成するのは完全に正常です。

各列挙値を指定する必要はありません。それらは自動的に1ずつ増加します。コンパイラーに値を選択させると、入力ミスやバグの作成の可能性が減りますが、値が表示されなくなります。デバッグ中。

それでも問題ありませんが、誰かが別のButtonStateを追加した場合に問題が発生するように、配列の境界チェックを行いたいと思います。

また、colors配列の要素は不変であるため、配列に別のコレクションを使用して、その不変を強制できるようにすることを検討してください。おそらく Dictionary< ButtonState、ButtonColor>

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top