2013-08-27 57 views
1

我有这个类:C++映射一个变量地址?

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; 

我怎样才能做到这一点,而不必去引用它,每次我想用它吗?

+0

使用引用而不是指针。并将引用的初始化移动到'Color'构造函数中,而不是'Texture'中。或者,也许你可以使用访问函数(例如,'r()/ r(float)'作为getter/setters)并去掉'Color'子类。 – syam

+0

@syam:引用而不是指针将不允许复制。 –

+0

@MooingDuck啊对了,没有想到,我的坏(我几乎总是使用访问器这种东西,他们更清洁恕我直言)。 – syam

回答

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对象,您还需要实现复制构造函数和赋值运算符。另外请注意,这种便利的成本相对较高:指针和参考方法都会通过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]; } 
}; 
+0

我没有理解Texture构造函数的一些东西,但它工作正常。 ..我有新的东西来研究! – Danicco

4

也许你可以使用C++的工会语言特性:

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

    // second representation (RGB) 
    struct RGBColor { 
     float r; 
     float g; 
     float b; 
    } 
}; 
+0

请注意,您无法通过写入命名值来编写diffuseColor元素,反之亦然!联盟一次只存储一种类型,访问不同类型的行为是未定义的行为,除非您访问这两种类型的通用前缀的成员。 –

+0

@DietmarKühl:我认为这个规则对于成员相同的类型有一些放松。也许这只是为了通过指针或其他东西来访问它们。 –

+0

9.5/1“如果标准布局联合包含多个共享公共初始序列(9.2)的标准布局结构,并且此标准布局联合类型的对象包含其中一个标准布局结构,则它是允许检查任何标准布局结构成员的共同初始序列;参见9.2。 - 结束注释]“(仍在寻找) –