2011-12-06 25 views
0

だから私はあなたがC++でクラスメンバーのために複数の名前を使用する方法

を使用してアクセスすることができたwのメンバーxを使用していますvec4クラス、Y、Zを、持っているpoint.x point.yなど

しかし、私はこのvec4クラスを私のカラークラスに再利用したいと思っています。スカラー倍数をサポートしています。オペレータは他の素敵なものをたくさんオーバーロードします。 別の表記を使ってメンバを参照できるようにしたいだけです:

r color.g color.b

など

私はマクロや他の構文的な砂糖を使ってこれを行うことができますか?

+6

かかわらず、これが機能するかどうかの、**は**非常に悪い考えです。あなたは入力システムを破壊しています。これはちょっとしたタイピングを省くためです。適切な方法は、再利用可能な演算子を持つことです(Boostを見てください)。*再利用可能な型はありません。 –

+0

¤私はほとんどKonrad Rudolph ’コメントに同意します。しかし、技術的には、(1)新しいクラス 'Color'を定義する、(2)すべてのコンストラクタで' r'、 'g'、' b'、(3)の参照メンバを参照させて参照するメンバを初期化する(4)「point」メンバに転送するpublicを提供することによって、関連する操作を公開する。しかし、 'r'、' g'と 'b'参照メンバの代わりに、' r() '、' g() 'と' b() 'アクセサだけを考えてください。アレイ内のピクセルに操作を引き渡すために、フライウェイトパターンも考慮してください。乾杯。 –

+0

@ KonradRudolph:型システムをどのように破壊するのか分かりません。 –

答えて

0

あなたは以下を使用することができます(...とそれだけで目的のIDEであることを確信している)のVisual Studioを使用している場合:

#include <cassert> 

union vec4 
{ 
    struct 
    { 
     float x; 
     float y; 
     float z; 
     float w; 
    }; 
    struct 
    { 
     float r; 
     float g; 
     float b; 
     float a; 
    }; 
}; 

int main() 
{ 
    vec4 vec = { 0 }; 
    vec.y = 10.0f; 
    assert(vec.g == 10.0f); 
    return 0; 
} 

あなたはそれを無効にすることができますがそれは、警告warning C4201: nonstandard extension used : nameless struct/unionが得られます。

EDIT:gcc supportsこの拡張も同様です。

0

ベクトルと色の間に共通のふるまいがある場合を除き、これは悪い考えです。しかし、あなたが尋ねてきたので、ここでそれを行う方法があります。

x、y、z、wメンバーを非公開にして、それらにアクセスするためのアクセサーメソッドを提供すると、同じメンバ変数を参照する2つの代替方法を提供するのは簡単です。たとえば:

class vec4 { 
private: 
    float _x, _y, _z, _w; 
public: 
    // vector getter/setters 
    float& x() { return _x; } 
    float& y() { return _y; } 
    float& z() { return _z; } 
    float& w() { return _w; } 

    // color getter/setters 
    float& r() { return _x; } 
    float& g() { return _y; } 
    float& b() { return _z; } 
    float& a() { return _w; } 

}; 

vec4 my_color; 
my_color.r() = 1.0f; 
my_color.g() = 0.0f; 
my_color.b() = 0.0f; 
my_color.a() = 1.0f; 
0

あなたは簡単にスタンドアロンのアクセサ関数であることを行うことができます。

struct vec4 { double x, y, z; }; 

double& get_r(vec4& v) { return v.z; } 
// and so on 
関連する問題