2016-07-20 22 views
0

は、このようなデフォルトコンストラクタとおもちゃstructを考えると初期化する:は、デフォルトコンストラクタを持つ構造体のパブリックメンバー

struct RGB { 
    unsigned char r, g, b; 

    RGB() 
     :r(0), g(0), b(0) {} 
}; 

は、どのように私はへのアクセスを持っていないと仮定すると、特定の色に1を初期化します私自身のコンストラクタを追加するソースコード。

これらは動作しませんなぜ私は完全には理解していない:

// OK, I can sort-of accept this one 
RGB red = {255, 0, 0}; 

// Not shorthand for green.r=0, green.g=255, green.b=0;? 
RGB green = {.r = 0, .g = 255, .b = 0}; 

// I seem to be missing a constructor that accepts a list? 
RGB blue{0, 0, 255}; 

は昔ながらを短縮するために、他のC++ 11の方法はあります:さらに

RGB yellow; 
yellow.r = 255; 
yellow.g = 255; 
yellow.b = 0; 

、上記のいずれかをサポートするように最小限にstructの宣言を変更し、デフォルトの初期化メソッドを持つ方法を教えてください。

答えて

2

あなたはどのようにヘルパー関数については、構造体のコンストラクタにデフォルト引数を追加する可能性がない場合:

ので、同じように使用でき
RGB makeRGB(unsigned char r, unsigned char g, unsigned char b) 
{ 
    RGB result; 
    result.r = r; 
    result.g = g; 
    result.b = b; 
    return result; 
} 

RGB red = makeRGB(255, 0, 0); 

Return value optimizationはの世話をしますがあなたはひどいコンパイラを使用していない限り、一時的ではなく、オーバーヘッドのないソリューションを提供します。


理想的なソリューションは、オプションの引数を取るようにデフォルトコンストラクタを変更することになります。

RGB red(255, 0, 0); 
RGB green{0, 255, 0}; 
RGB blue; 
blue.b = 255; 

Live demo hereを:あなたが期待するように使用することができます

struct RGB { 
    unsigned char r, g, b; 

    explicit RGB(unsigned char r, unsigned char g, unsigned char b) 
     :r(r), g(g), b(b) {} 
    RGB() : RGB(0, 0, 0) {} 
}; 

+1

「理想的な解決策」で呼び出すことができるので、理想的ではない - それはRGB' 'に符号なしchar''からの暗黙的な変換を定義します。 –

+0

ありがとう、私はおそらく問題を考えすぎていました。私は問題のあるヘッダを生成するプロジェクトにバグ報告/変更要求を提出して、初期化にやさしいコンストラクタを若干作成できるかどうかを確認する必要があります。 –

0

考える

struct color 
{ 
color(std::initializer_list<float> list) = delete; 
float r, g, b; 
}; 
  1. color c = {1,2,3}color c {1,2,3}は同じです。
  2. のような構文color c = {.r = 0, .g = 255, .b = 0};は、C++ではなくC言語に固有のものです。
  3. color c = {1,2,3};はC++ 11では完全に問題ありません。それはaggregate initializationと呼ばれます。さらに、明示的なコンストラクタをオーバーライドしてもinitializer_listからオーバーライドします。リンクは明示的に削除する方法を説明しています。 initializer_listから
  4. コンストラクタを明示的color c({1,2,3})
関連する問題