1

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

class Texture
{
    public:
        //I need this variable in this format
        float diffuseColor[3];
}

しかし、「diffuseColor[0]」などを扱うよりも簡単なインターフェイスを作成したいと思います。

myTexture.color.r = 1.0f; //this is diffuseColor[0]

だから、次のような、diffuseColor 値に対するシェルとして機能するクラスを取得しようとしています。

class Color
{
    public:
        float *r, *g, *b;
}

そして私の Texture クラスでは:

class Texture
{
    public:
        Texture()
        {
            color.r = &diffuseColor[0];
            color.g = &diffuseColor[1];
            color.b = &diffuseColor[2];
        }

        Color color;
    private:
        float diffuseColor[3];
}

しかし、現在の方法では、色の値を使用する場合は、色の値を逆参照する必要があります。

(*myTexture.color.r) = 1.0f;

使用するたびに逆参照せずにこれを達成するにはどうすればよいですか?

4

2 に答える 2

7

メンバー初期化子リストで初期化される参照を使用できます。

struct Color {
    Color(float* colors): r(colors[0]), g(colors[1]), b(colors[2]) {}
    float& r;
    float& g;
    float& b;
};
class Texture {
    float diffuseColor[3];
public:
    Color color;
    Texture(): diffuseColor(), color(this->diffuseColor) {}
};

オブジェクトをコピーおよび/または代入Textureする必要がある場合は、コピー コンストラクターと代入演算子も実装する必要があります。また、この便利さには比較的大きなコストがかかることに注意してください。ポインターと参照アプローチの両方で、Textureオブジェクトのサイズが 3 ポインター分増加します。代わりに、アクセサーを使用する方がよい場合があります。たとえば、次のようになります。

class Texture {
    float diffuseColor[3];
public:
    float& r() { return this->diffuseColor[0]; }
    float& g() { return this->diffuseColor[1]; }
    float& b() { return this->diffuseColor[2]; }
};
于 2013-08-27T23:25:43.323 に答える
4

おそらく、C++ のユニオン言語機能を使用できます。

union ColorUnion {
    // first representation (Texture)
    struct TextureColor {
        float diffuseColor[3];
    }

    // second representation (RGB) 
    struct RGBColor {
        float r;
        float g;
        float b;
    }
};
于 2013-08-27T23:25:31.933 に答える