2009-08-09 14 views
2

私は可能な限り多目的であるはずの単純なカラークラスを作成しようとしています。参照が正しく割り当てられていないコンストラクタ?

class MyColor { 
private: 
uint8 v[4]; 
public: 
uint8 &r, &g, &b, &a; 

MyColor() : r(v[0]), g(v[1]), b(v[2]), a(v[3]) {} 
MyColor(uint8 red, uint8 green, uint8 blue, uint8 alpha = 255) : r(v[0]), g(v[1]), b(v[2]), a(v[3]) { 
    printf("%d, %d, %d, %d\n", red, green, blue, alpha); 
    r = red; 
    g = green; 
    b = blue; 
    a = alpha; 
} 
MyColor(uint8 vec[]) : r(v[0]), g(v[1]), b(v[2]), a(v[3]) { 
    MyColor(vec[0], vec[1], vec[2], vec[3]); 
} 
uint8 operator [](int i) { 
    return v[i]; 
} 
operator const GLubyte*() { 
    return v; 
} 
}; 

そして、ここで私がしようとしているコードです:ここでは次のようになります

uint8 tmp[] = {1,2,3,4}; 
MyColor c(tmp); 
printf("%d, %d, %d, %d\n", c.r, c.g, c.b, c.a); 

(私はMyColor c = {1,2,3,4}を行っていることができれば、私はそれを好きだろうが、私はそれがで可能ですわからないんだけど?

1, 2, 3, 4 
112, 22, 104, 89 

だから、値I:現在の仕様)とにかく

は、それがこの出力します2番目のコンストラクタに収まるのは正しいですが、それが返ってくると...それらの値はランダムですか?

r = redは、rv[0]~redの両方を設定してください。 rはちょうどv[0]への参照なので、実際には同じ値を共有していますか?私は宇宙のどこかへの参照のいくつかの変わった再割り当てをやっていませんか?

答えて

4

残念ながら、C++の現時点ではコンストラクタの転送はできません。問題はここにある:これは実際に何

MyColor(uint8 vec[]) : r(v[0]), g(v[1]), b(v[2]), a(v[3]) { 
    MyColor(vec[0], vec[1], vec[2], vec[3]); 
} 

は、メンバーベクトルvへの参照をバインドし、コンストラクタの本体で、その後廃棄される一時的なMyColor値を作成することです。

出力の2行目には、構築されたMyColorのメンバーベクトルvのガベージ初期値が出力されています。

私は、コンストラクタの一部を割り当てて、4 uint8を取得し、両方のコンストラクタからそれを呼び出すことをお勧めします。

void AssignColorValues(uint8 red, uint8 green, uint8 blue, uint8 alpha) 
{ 
    printf("%d, %d, %d, %d\n", red, green, blue, alpha); 
    r = red; 
    g = green; 
    b = blue; 
    a = alpha; 
} 

MyColor(uint8 red, uint8 green, uint8 blue, uint8 alpha = 255) : r(v[0]), g(v[1]),  b(v[2]), a(v[3]) 
{ 
    AssignColorValues(red, green, blue, alpha); 
} 

MyColor(uint8 vec[]) : r(v[0]), g(v[1]), b(v[2]), a(v[3]) 
{ 
    AssignColorValues(vec[0], vec[1], vec[2], vec[3]); 
} 
+0

ああ! *それは何をしているのか。私はそれを拾うべきだったと思う。コンストラクターフォワーディングもできません。これはC++のかなり愚かな制限のように思えます。 – mpen

+0

ほとんどのもの(私の更新を見てください)のメンバ関数に機能を分けることができるので、コンストラクタの転送は、複数のコンストラクタのイニシャライザリストで複雑な式を共有する場合に大きなメリットです。私は実際にこの機能を1〜2回見逃してしまいました。これはC++の新しいバージョンになります。 –

+0

ああ..とにかくやってしまったのですが、とにかくセット機能が必要だったからです。二重目的:) – mpen

0

実際に、私はあなたが今日このことのほとんどを行うことができると信じています。 boost :: arrayは定数式から初期化することができるので、同様にできるはずです。私はあなたが他のコンストラクタを取り除かなければならないと信じています。代入演算子を使用すると、代入演算子を使用することができます。