正しい値をC ++ enumタイプ変数に割り当てることができないのはなぜですか?

StackOverflow https://stackoverflow.com/questions/19835143

質問

何が起こっているのか理解できません。 Visual Studio 2008を使用して、次のような列挙を定義しました。

enum MyType{
    A,
    B,
    C
};

次に、メンバー変数を初期化するために使用します。

class MyClass
{
    private:
        bool   bit_;
        uint16 num_;
        MyType member_;
    public:
        MyClass(MyType value){
            member_ = value; // This the assignment which fails
        } // Here, there's a breakpoint to query member_ value    
};

myClassインスタンス= new MyClass();

私はデバッグ構成を使用しているので、変数を読むときに最適化をだますことはできません。割り当て直後のブレークポイントで、デブガーはメンバー_の値を示しています member_ = C.

それはデバッガーのwhatch更新の問題かもしれませんが、メソッド内では、チェック時に真であることを評価します。

if(member_ == C){
    // ??
}

また、他の値に割り当てると、奇妙な数字が得られます。 member_ = B 与えます member_ = 258 それを偽装するとき。何が悪いのか教えてもらえますか?前もって感謝します。

編集#1

割り当て後の理由を説明する面白い効果に気づきました member_ = A 表現 member_ == C に評価します true デフォルト値の列挙の場合:

列挙の場合

enum MyType{ A, B, C}; // equivalent to enum MyType{ A = 0, B = 1, C = 2};

私は得ます

MyType  a = A; // but when fetching a the value is   2  (0x0002)  thats the map for C!
MyType  b = B; // but when fetching a the value is 258  (0x0102)
MyType  c = C; // but when fetching a the value is 514  (0x0202)

しかし、私が作ったら

enum MyType{ A = 5, B = 6, C = 7};

私は得ます

MyType  a = A; // but when fetching a the value is 1282  (0x0502)
MyType  b = B; // but when fetching a the value is 1538  (0x0602)
MyType  c = C; // but when fetching a the value is 1794  (0x0702)

したがって、その#?!^%の列挙を割り当てるとき、ルールは8ビットをシフトして2を追加します。コンパイラの問題のように聞こえます。

ところで、タイプを作る member_ することが int 代わりは MyType 何も変わらない。

編集#2さらに2人のメンバーをクラスに追加しました。これは問題の本当の原因です。時間制限が消えるとすぐに答えを投稿します(質問の投稿から8時間)。

役に立ちましたか?

解決 2

みんな、ありがとう。職場の誰かが私に問題の起源を指摘しました。

これは、プロジェクトの誤った構成の問題であり、データの調整の問題をもたらします。

コンパイル後、現在のプロジェクト設定を使用して、クラスの2つの最初のメンバーは3バイトのサイズです。

それは4バイトである必要があります。したがって、1バイトのずれです。追加された2つの追加は、不整合されたバイトのゴミであるため、効果全体が1つのバイトをシフトして2を追加することです。

この効果は、エレガントなソリューションではありませんが、追加のメンバーを追加することができます(解決策はプロジェクトをcorctlyに設定することです)。

class MyClass
{
    private:
        bool   bit_;  // 1 byte
        uint16 num_;  // 2 byte

        bool dummy;   // extra byte to help the alignment

        MyType member_;
    public:
        MyClass(MyType value){
            member_ = value; // Now it works as expected.
        }
};

他のヒント

ENUMエントリには一意の値が必要です。 a、b、cの列挙がある場合があります。ここで、aとcの両方が「42」に等しくなります。そのような場合、VARの値が42の場合、IDE 1つだけ表示されます 両方ではなく、マッチングエントリ、AまたはCの。

このような「複製」エントリを使用して列挙を簡単に作成できます。

enum { A=1, B=1, C=1 }

しかし、おそらく、あなたはそのようにそれをしませんでした。ただし、Autonumberingを使用する場合、誤って(または意図的に)重複することもできます。

enum { A, B, C }       // 0,1,2
enum { A, B, C=0 }     // 0,1,0
enum { A=2, B=1, C }   // 2,1,2
enum { A=-1, B, C=0 }  // -1,0,0

列挙定義を再確認してください。

IEを参照してください http://www.learncpp.com/cpp-tutorial/45-enumerated-types/

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