2013-08-27 98 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。 - 結束註釋]「(仍在尋找) –