enumをintとして扱う必要があるパターンはあるのでしょうか。

このQ&Aのポイント
  • enumをintとして扱う必要があるパターンはあるのでしょうか。よくenumをintとして扱うことがありますが、その利点について知りたいです。
  • enumをintとして扱うことは一般的ですが、どのような利点があるのでしょうか。また、enum名を直接使用する場合に問題が発生することがあるのか、疑問です。
  • enumをintとして扱う必要性について知りたいです。intとして定義することによる利点や問題があるのか、教えてください。また、enum名を直接使用する場合の問題についても教えてください。
回答を見る
  • ベストアンサー

enumをintとして扱う必要があるパターンはあるのでしょうか。

enumをintとして扱う必要があるパターンはあるのでしょうか。 よく enum ENUM_SAMPLE {  A,  B,  C, }; class CLASS_SAMPLE { private:  int type; // ENUM_SAMPLEのA,B,Cしか入らない public:  int GetType(){ return type; } }; という記述を良く見かけます。 class CLASS_SAMPLE { private:  ENUM_SAMPLE type; // ENUM_SAMPLEのA,B,Cしか入らない public:  ENUM_SAMPLE GetType(){ return type; } }; のほうが良いのではないか思うのですが、intで定義することによる利点が何かあるのでしょうか。 あと、過去に // bcc利用時に問題があるのでintに変更しました int CLASS_SAMPLE::GetType {  return type; } というコメントがついたソースを見たことがあり、 自分でbccを使ってenumを返すように修正してテストしてみたことがあるのですが、何が問題なのか見つけることが出来ませんでした。 enum名を直接使用した場合に問題が発生することがあるのか、またどのような問題が発生することがあるのか、回答お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

enumをintとして扱う必要があるパターン、 つまり考えられるenumのデメリットですが 例えばenumをヘッダに定義していた場合、そのenumを使う箇所は そのヘッダをincludeしなければなりません。 この状態でenum定義を変更した場合、そのヘッダをインクルードしたソースは コンパイルされることになります。(つまりソースの依存関係が強くなりリビルドに時間がかかります。) 大きいプロジェクトであればフルビルドに1時間以上かかる場合もあるのでトライアンドエラーの障壁になりえます。 ※勿論enumを引数や返り値にすれば、コンパイル時に型チェックができる利点があります。 >// bcc利用時に問題があるのでintに変更しました この情報だけでは推測の域をでませんが、 bccではenumを可能な限りshort型として扱うようにするコンパイルオプションがあるようです。 enumをどう扱うかは統一しないとリンクエラーや動的なライブラリならスタックが破壊される可能性があります。

qwertfk
質問者

お礼

ありがとうございます。 確かにinlcludeの依存が発生するというデメリットはありますね。 >bccではenumを可能な限りshort型として扱うようにするコンパイルオプションがあるようです。 >enumをどう扱うかは統一しないとリンクエラーや動的なライブラリならスタックが破壊される可能性があります。 は知りませんでした。 そのあたりは要注意ですね。

関連するQ&A

  • enumの使い方

    scanfから入力した値からenumを使うことはできませんか? 以下のようにしてみたのですが解決策がわかりません よろしくお願いします。 #include <stdio.h> enum DATA { a=1, b, c }; int main() { enum DATA data; char tmp; scanf("%c", &tmp); // aを入力したとする data = tmp; printf("%d\n", data); // 1が欲しい return 0; }

  • インターフェースを持つenum定数を引数にする方法

    jdk5を利用しています。 特定のIFを持つenum定数が、複数あります。 例.IHogeをもつenum定数 public enum Hoge implements IHoge { HOGE1(1),HOGE2(2),HOGE3(3); private int no = 0; private Hoge(int no) {this.no = no;} /* IFのMethod */ public int getNo(){return no ;} } enum定数を使用して、下のような処理を行っています。 class A { public void a(){ this.c.setClass(Hoge); for(IHoge iHoge : Hoge.values()) { this.setHogeX(iHoge.getNo()); } } public void b(){ //別のenum定数の処理 } } 現在、enum定数毎に、別々のメソッドを用意して対応していますが、 処理が、全く同じな為、一つのメソッドにしたいと思っています。 IFを持つenum定数を、引数にしたいのですが、どのように記述すればよいか分りません。 public void a(Class<? extends Enum> hoge) {} 上の宣言だと、enum定数は通りますが、IFは渡せません。 本などを調べましたが、見つける事が出来ませんでした。 ご存知の方、ご教授よろしくお願いいたします。

  • C++の解放時の動作

    お世話になっております。 C++の解放時の動作について疑問があるため質問させていただきます。 class Super{ private: float x, y, z; public: ~Super(){} }; class Child : public Super{ private: int a, b, c; public: ~Child(){} }; int main( int argc, char **argv ){ A *a = new Child: delete a; return 0; } 簡略ですが、上記を走らせた場合、インスタンスは正しく解放されるのでしょうか? 一応デストラクタは動作しますが、実際のところ、子クラス分のデータが解放されない気がします。 ネット上のサンプルでこういった例を時々目にしますが、この方法は問題ないのでしょうか? よろしくお願いいたします。

  • C++のenumについて質問

    C++のenum文で、 enum Sample { a, b, c, }; とあったとき、このSampleの要素数(?)である3を 何らかの方法で収得することは可能でしょうか?

  • enumについて

    Java2 5.0で「enum」という列挙型が導入されてそうですが、 意味がよくわかりません。 今までは、interface等に (1) public final static int a = 0; public final static int b = 1; public final static int c = 2; などと、指定してきましたが、enumを使う事で、型に”安全”に なると書かれていますが、それもよくわかりません。 ”列挙値は、整数ではない”とも見たりしますが、(1)のよな使い方 をしなくなるのでしょうか。 いつどのような使い方するのか、どなたかご教示ください。 また、私のようなものに、合うようなサイトがあれば、教えてください。 宜しくお願いします。

  • クラスの設計の問題

    今C++でクラスの設計をしています。 どう設計すれば、いいか分からないので、しっている方に教えていただきたいですが。 class A{ private: int id; public: int getId(); void setId(); }; class B{ private: int id; public: int getId(); void setId(); } class C{ private: int id; public: int getId(); void setId(); } この三つのクラスが、共通な機能があります。また、実装も同じで、 継承を利用して、どう設計すれば、いいですか? よろしくお願いします。

  • 参照の初期化?~int& alias2 = get() + alias1;分かりません

    <c++です>こんばんは、宜しくお願い致します。 > class CSample > { > public: > CSample(){ m_num = 123; } // コンストラクタ > int& get(){ return m_num; } // メンバ変数を参照戻し > private: > int m_num; > }; >(1) int& alias1 = get(); >(2) alias1 *= 2; >(3) int& alias2 = get() + alias1; // このようにブロックの途中で宣 >言できるとできます。 あるサイトで↑のようなサンプルプログラムがあるのですが(1)は分かるのですが(参照の初期化をしている)、(3)の動作が分かりません。参照の初期化みたいですが、参照型の戻り値get()に変数alias1を足しているのですがそれを別の参照alias2の初期化みたいになっており理解できません。教えてください。

  • 静的メンバ、ネストクラス、enumのアクセス

    下記のコードを試した所、(1)(4)は無事動作しますが、 (2)と(3)はコンパイルエラーになってしまいます。 初め、静的メンバの場合はnullでも動作する事にすごい驚いたんですが、 どこまでなら問題なく動作するかのラインがわからなくてこまっています。もしよろしければアドバイスをよろしくお願いします。 class Test{ static String A="A"; static class B{ static String val = "B"; } enum C{A,B,C} } enum D{A,B,C} class Sta{ public static void main(String[] args){ Test y=null; D y2 = null; (1)System.out.println(y.A); (2)System.out.println(y.B.val); (3)System.out.println(y.C.A); (4)System.out.println(y2.C); }}

  • クラスの継承、メソッドのオーバーライド

    ↓の問題が全然わかりません。 問題:サブクラスのsiki2にax2+bx+c=0(b2-4ac>0)とコンストラクタ を定義して、スーパークラスのsiki1にax+b=0とコンストラクタを定義し、解を求めるkaiメソッドを定義する という問題です。途中のプログラムを↓に書きました。 スーパークラス class houteisiki1{ private int kai; private int a; private int b; private int x; //コンストラクタ houteisiki1(int s, int d, int e, int f){ solve=s; a=d; b=e; x=f; } //kaiメソッド kai=(a*x)+b; } サブクラス class houteisiki2 extends houteisiki1{ static int kai(int a, int b, int c, int x){ kai=(a*x*x)+(b*x)+c; if((b*b)+(-4*a*c)>0){ return kai; }else{ println("エラー"); } } } テストクラス class test{ public static void main(string[] args){ ここまで作りましたが、解らなくなりましたので教えてください。 まだ、JAVAを勉強して日が浅いので解りやすく教えてください。

    • ベストアンサー
    • Java
  • C++/CLIでクラス内の要素を相互利用する方法

    C++/CLIでクラスの中に定義された構造体等を、複数のクラス間で相互利用したいのですが、そのようなことは可能なのでしょうか。 とりあえず以下のコードを見ていただきたいのですが、 ref class class1; ref class class2; ref class class1 { public:  enum struct enum1  {   aa,bb  };  void func1a(class1^ obj){} // 1. OK  void func2a(class2^ obj){} // 2. OK  void func1b(class1::enum1 e){} // 3. OK  void func2b(class2::enum2 e){} // 4. ERROR }; ref class class2 { public:  enum struct enum2  {   aa,bb  };  void func1a(class1^ obj){} // 5. OK  void func2a(class2^ obj){} // 6. OK  void func1b(class1::enum1 e){} // 7. OK  void func2b(class2::enum2 e){} // 8. OK }; これの4.がコンパイルエラーになります。 このような構造を定義することはできないのでしょうか。