structs in Initialisierungslisten initialisieren
-
Hallo zusammen,
konnte leider bisher nichts darüber finden:
Wie initialisiere ich denn eine Struktur in einer Initialisierungsliste des Konstruktors?
Also folgender Fall:
class A { public: A() : b(???) private: const struct b; }
Kann mir da jemand weiterhelfen?
Hab schon probiert, ddie Werte der Felder der Struktur einfach mit Kommas getrennt hinter b( zu schreiben, hat leider nicht funktioniert, auch nicht, wenn ich geschweifte Klammern hinter b( verwendet habe!Danke schon mal!
Ciao
-
kommt auf den konstruktor der struct b an
-
gib dem struct einen konstruktor.
-
Hm, auf die Struktur hab ich keinen Einfluss, die ist Teil der Betriebssystem-API.
Der Compiler sagt hier, es gäbe den Konstruktur b() und b(const b &).
Aber wie kann ich das nutzen?Wäre es hier besser, die Klasse erbt von der Struktur?
-
Reth schrieb:
Der Compiler sagt hier, es gäbe den Konstruktur b() und b(const b &).
Naja, das sind default- und copy-ctor. Die hat jede Klasse erstmal. Einzelne Elemente kannst du damit aber nicht initialisieren. Mit was willst du denn überhaupt initialisieren? Einem anderen Objekt der Struktur? Dann kannst du den copy-ctor benutzen. Bei einzelnen Elementen bleibt dir nichts anderes übrig, als im Rumpf zuzuweisen.
A() { b.x = 1; b.y = 2; //... }
Reth schrieb:
Wäre es hier besser, die Klasse erbt von der Struktur?
Das würde am Problem auch erstmal nichts ändern, da für das Initialisieren der Basisklasse die gleichen Möglichkeiten zur Verfügung stehen, wie für Member.
-
Hm, wenn ich die Initialisierung im Konstruktor mache, kann ich die Membervariable im Headerfile nicht als Konstante anlegen, da der Compiler dann sagt, dass sie readonly ist.
Wie kann ich denn die Strukturvariable als statische Konstante definieren und dennoch im Konstruktor initilisieren?
Wenn ich das const weglasse sagt der Compiler die Variable vom Typ dieser Struktur hätte nen unvollständigen Typ! Keine Ahnung wieso er das behauptet, da der Typ ansich stimmt!
Weiss da jmd. Näheres?
-
wenn du keinen konstruktor einbauen kannst, kannst du einen freistehenden "konstruktor" schaffen
foo mkfoo(int a, int b) { foo f = {a, b}; return f; } ... A() : b(mkfoo(1,2)) {}
-
Reth schrieb:
Hm, wenn ich die Initialisierung im Konstruktor mache, kann ich die Membervariable im Headerfile nicht als Konstante anlegen, da der Compiler dann sagt, dass sie readonly ist.
Du meinst Zuweisung und nicht Initialisierung. const deklarierte Bezeichner können im ctor ganz normal initialisiert werden, ob implizit oder explizit spielt dabei keine Rolle. Danach kann man sie aber nicht mehr verändern. DrGreenthumb hat ja im Beispiel gezeigt, wie du die Initialisierung einer POD Struktur, halt ohne passenden ctor, trotzdem machen kannst. Direkt geht sowas leider nicht.
Reth schrieb:
Wie kann ich denn die Strukturvariable als statische Konstante definieren und dennoch im Konstruktor initilisieren?
Eine statische Variable wird nicht im ctor initialisiert, da sie zu keinem Objet gehört. Die Klasse, in der sie deklariert wird, fungiert dabei mehr oder weniger als eine Art "Namensraum". Bei deiner Struktur sieht die Initialisierung zB wie folgt aus:
class A { private: static const b b_; }; const b A::b_ = {1, 2};
Normalerweise kommt die Initialisierung in die Übersetzungseinheit (.cpp), da aber const, kannst du diese auch in den Header schreiben, und stellt keine ODR Verletzung dar.
Reth schrieb:
Wenn ich das const weglasse sagt der Compiler die Variable vom Typ dieser Struktur hätte nen unvollständigen Typ! Keine Ahnung wieso er das behauptet, da der Typ ansich stimmt!
Ist denn der Typ zu diesem Zeitpunkt komplett definiert? Oder steht nur irgendwo eine Vorwärtsdeklaration?
struct b;
Im letzten Fall weiss der Compiler nur, dass eine Struktur mit dem Namen existiert. Wenn du eine Instanz davon anlegen willst, nützt dir das aber nichts. Da muss der Compiler schon die "vollständige" Definition kennen.
-
groovemaster schrieb:
Normalerweise kommt die Initialisierung in die Übersetzungseinheit (.cpp), da aber const, kannst du diese auch in den Header schreiben, und stellt keine ODR Verletzung dar.
bist du sicher? const bewirkt internal linkage nur bei namespace objekten. ansonsten dürfen statische member eigentlich nur bei klassen templates mehrfach definiert werden.
-
Ja, hast Recht, das ist nur bei Bezeichnern auf Namensraumebene zulässig.