2016-07-20 8 views
0

ein Spielzeug struct mit einem Standardkonstruktor wie dieser Gegeben: Ich habe keinen ZugriffInitialisiere öffentlichen Mitglieder einer Struktur mit einem Standard-Konstruktor

struct RGB { 
    unsigned char r, g, b; 

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

Wie initialisiere ich ein auf eine bestimmte Farbe, unter der Annahme zu der Quellcode, um meinen eigenen Konstruktor hinzuzufügen.

Ich verstehe nicht ganz, warum diese nicht funktionieren:

// 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}; 

Gibt es eine andere C++ 11 Art und Weise die gute altmodische zu verkürzen:

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

Außerdem Wie könnte ich die struct Deklaration minimal modifizieren, um irgendeine der oben genannten zu unterstützen, sowie eine Standardinitialisierungsmethode zu haben.

Antwort

2

Wenn Sie keine Möglichkeit haben, Standardargumente auf die Struktur Konstruktor, wie über eine Hilfsfunktion hinzuzufügen:

RGB makeRGB(unsigned char r, unsigned char g, unsigned char b) 
{ 
    RGB result; 
    result.r = r; 
    result.g = g; 
    result.b = b; 
    return result; 
} 

Welche kann wie so verwendet werden:

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

Return value optimization kümmern wird von die temporäre und bieten eine Overhead-Lösung, es sei denn, Sie verwenden einen schrecklichen Compiler.


Die ideale Lösung wäre die Standardkonstruktors werden modifizieren optionale Argumente zu nehmen:

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) {} 
}; 

, die verwendet werden können, wie man es erwarten würde:

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

Live demo here.

+1

Die "ideale Lösung" ist nicht so ideal bezeichnet werden - es definiert eine implizite Konvertierung von 'unsigned char' zu' RGB'. –

+0

Danke, ich habe das Problem wahrscheinlich übertrieben. Ich sollte einen Fehlerbericht/eine Änderungsanforderung an das Projekt senden, das die problematischen Header generiert, um zu sehen, ob sie leicht initialisierungsfreundlichere Konstruktoren erstellen können. –

0

Bei

struct color 
{ 
color(std::initializer_list<float> list) = delete; 
float r, g, b; 
}; 
  1. color c = {1,2,3} und color c {1,2,3} sind die gleichen.
  2. Syntax wie color c = {.r = 0, .g = 255, .b = 0}; ist spezifisch für C-Programmiersprache, nicht C++.
  3. color c = {1,2,3}; ist völlig in Ordnung in C++ 11. Es heißt aggregate initialization. Und es überschreibt sogar den expliziten Konstruktor von initializer_list. Link beschreibt, wie Sie es explizit löschen können.
  4. Constructor von initializer_list kann explizit durch color c({1,2,3})