2011-02-05 11 views
4

この質問は私の間違いです。 下記のコードは問題なく良好に構築されています。C++でanonymous union/structメンバーにアクセスするには?


私はこのクラスを持っています。

Vector.h

struct Vector 
{ 
    union 
    { 
     float elements[4]; 
     struct 
     { 
      float x; 
      float y; 
      float z; 
      float w; 
     };     
    }; 

    float length(); 
} 

Vector.cpp部材X、Y、Z、Wにアクセスする方法

float Vector::length() 
{ 
    return x; // error: 'x' was not declared in this scope 
} 

+1

これはグラムで(構造体のベクタ後のセミコロンで)私のために罰金コンパイル++ 4.4.0:今、あなたはこのようなあなたのメンバーにアクセスすることができます

struct Vector { union { float elements[4]; struct { float x; float y; float z; float w; } v; } u; float length(); }; 

を。 http://ideone.com/m5tVuを参照してください。 – TonyK

+0

@TonyK私の間違いに対する謝罪。それはうまくコンパイルされています。私はそれが前にコンパイルされていなかった理由を理解できません...申し訳ありません、ありがとうございます! – Eonil

+0

@Eonil良い質問+1 –

答えて

5

匿名ユニオン内に構造体のインスタンスが必要です。あなたは何をしたいのですか?

struct Vector 
{ 
    union 
    { 
    float elements[4]; 
    struct 
    { 
     float x, y, z, w; 
    }aMember; 
    }; 

    float length() const 
    { 
    return aMember.x; 
    } 
}; 
+1

暗黙的にインスタンスが存在するメンバ関数でエラーが発生しています。私はこれがおそらく他の何かのためだと思う。 – templatetypedef

+0

@templatedtypedef:私は組合内部の構造体について話していました。私は自分の答えを更新しましたので、あなたのdownvoteを取り去ってください。 –

+0

@ Polybos-私の間違い;それを指摘してくれてありがとう! – templatetypedef

4

あなたが作成したものは、匿名のメンバーではなく匿名のタイプ(これは単独では役に立たない)です。匿名のメンバーを作成する必要があります。これはあなたの構造体とあなたの組合の両方に関係します。

このようなヘッダ調整:

u.elements[0] = 0.5f; 
if(u.v.x == 0.5f) // this will pass 
    doStuff(); 
+1

なぜ匿名の組合を使ってみましょうか?それはまったく問題はなく、時には推薦さえあります(http://www.devx.com/tips/Tip/12470) –

+0

@Polybos良い点、私は匿名の組合について今まで知りませんでした:) – Fiktik

関連する問題