enumとインクリメント・デクリメント演算子

[戻る]
enum 2012/07/23(月) 09:15:02
初歩的な質問で恐縮です。

enumで定義した値が連番になっているとき、この定数1を足したり引いたりすると
隣の値になる、ということは、どうすればできるのでしょうか。

enum X{A,B,C,D};と置いたときに

X x=A;
x++;

としてxをBにしようとしたのですが、++の箇所にて、

「Error:列挙された型でこの操作には、該当するユーザー定義演算子が必要です」

と出ました。
ユーザー定義演算子とは、どのように作るものなのでしょうか。

enumにした値はint型だと聞いているので、足したり引いたりできるはずですが、
どうも上手くいきません。

お忙しいとは存じますが、よろしくお願いします。

仲澤@失業者 2012/07/23(月) 10:37:51
まず、enumはintではありません。
とれる値の範囲がintと同じなだけです。

次に、本来、enum型は「変化しない値」を意味するので、
++の様に「値が変化する演算はできない」わけですね。
従って、
 1.++したいのならenumでない型を使用する。又は
 2.enum型を使用したいなら、その型に対して
  値が変化する演算はしてはいけない。
ということになります。どちらかを選びましょう。

さて、とは言うもののデバッグ時など、一時的にenumに演算をしたい
場面も考えられます。こういった場合は、一旦int型に代入してから
(あえてキャストはお勧めしません)演算しましょう。

ホウジョウウサギ 2012/07/23(月) 13:21:45
++の結果がX型じゃなくてもいいのなら

int x = A;
x++;

にすればいいけど,
X型じゃないとダメな場合は

const X XArray[4] = { A,B,C,D };

for( int i=0; i<4; i++ )
{
  X x = XArray[i];
  ...
}

みたいなことはたまにやる.

enum 2012/07/24(火) 19:31:22
[[解決]]
ご返答、ありがとうございます。

X x=A;

ではなく、

int x=A;

としました。
お騒がせ致しました。

古いスレッドには追加発言できません。