[an error occurred while processing this directive] [an error occurred while processing this directive]

定数・const・static・enum

C++で定数 (1: enumを使う)

単にenumとして定数を宣言します。enumの型自体を使うことはないから、無名enumでOKです。
ちょっと反則っぽいけど、定数同士の比較しか行わないならこの方法がメジャーです。
enum {MAX = 100};
これで
#define MAX 100
と同じような効果が得られます。なお、enumの実体はintです。

C++で定数 (2: const staticを使う)

C++では、#define以外にconstを用いて定数が宣言できる。普通のグローバル変数だと至って簡単で、
const int MAX = 100;
と書くだけ。
しかし一筋縄でいかないのがクラス内の定数。クラスの変数宣言部分での初期化は許されていないので、
class A{
  const int MAX = 100;
};
はこんなコンパイルエラーになる。
error: ISO C++ forbids initialization of member `MAX'
error: making `MAX' static
ではどうするか…というと、一つの方法はコンストラクタで初期化する。const変数は代入はできないけど、初期化の操作は代入ではないから可能です。
class A{
  const int MAX;
 A() : MAX(100){}
};
もしこのconst変数がインスタンスによらず一定 (つまり定数として利用する)のであれば、まずstaticを付ける。これでMAXにはインスタンスごとに別のメモリが割り当てられるのではなく、ただ一つのメモリが共用されるようになる。
さらに、初期化はクラス定義の外側で行う。
class A{
  const static int MAX;
/* もっと色々定義を書く */
};

const int A::MAX = 100;

ちょうどクラス内のメンバ関数(メソッド)定義のように書きます。ヘッダファイルではなくて実体のファイル(.cpp)に書きましょう。
まず注目したいのが、MAXはプライベート変数なのに外部からアクセス? してること。でもこれはアクセスじゃなくて初期化という扱いのようです。さらに初期化(100を入れてるとこ)のところではstaticが抜けているのにも注意。"::"を使ってアクセスできるのはstatic変数のみなので、この変数がstaticなのは言わば自明なので、書く必要が無いです。
配列の初期化もできる。
class A{
  const static int fib[5];
/* もっと色々定義を書く */
};

const int A::fib = {1,1,2,3,5};

C++でenum (enumuration)

enumってintの定数に比べて宣言時に書かないといけない量は少ないんだけど、デバッグの時はprintfとかcoutで表示してみても数字しか出なくて不便。 あと短い名前を使おうとすると、けっこうキーワードとかぶってしまったり。
C++ではクラスが使えて、クラス内でenumを宣言できるので、たとえば下みたいなことをするといいかも。
class Msg {
 public:
  typedef enum {
    request,
    response
  } kind;

  static char *label(kind k){
    switch(k){
    case request  : return "request";
    case response : return "response";
    }
    assert(0);
    return NULL;
  }
};
で、こんな風に使う。
  Msg::kind mk = Msg::request;
  std::cout << "mk = " << Msg::label(mk) << std::endl;
[an error occurred while processing this directive]