Basisinitialisierer für Struktur?
-
Hey!
Normalerweise kann man ja alle Elemente einer Struktur so auf 0 setzen:
WNDCLASS windowClass = { 0 };Aber wie geht das mit dem Elementinitialisierer?
Window::Window() : windowClass({ 0 }) { ; }Haut nicht hin...
Danke!
MfG
-
ceplusplus@loggedoff schrieb:
Hey!
Normalerweise kann man ja alle Elemente einer Struktur so auf 0 setzen:
WNDCLASS windowClass = { 0 };Genausgenommen ist die allgemeine Form in C++
WNDCLASS windowClass = {};also ohne die 0. In C ist das nicht möglich - dort existieren einerseits keine leeren Strukturen und andererseits ist 0 dort immer ein gültiger Initialisierer (ggf. durch Brace-eliminierung, wenn das erste Element selbst ein Aggregat ist) . Eine leere Struktur oder eine Struktur deren erstes Element eine Klasse, die nicht mit 0 initialisiert werden kann, ist, kann dagegen nicht mit {0} initialisiert werden - so etwas ist aber auch nur in C++ möglich.
Aber wie geht das mit dem Elementinitialisierer?
Window::Window() : windowClass({ 0 }) { ; }Haut nicht hin...
Danke!
MfGDer Defaultkonstruktor wird für solche Klassen automatisch generiert.
Window::Window() : windowClass() {}
-
Arrays und Strukturen lassen sich nicht in der Initialisierungsliste initialisieren, d.h. entweder du verwendest memset(...) (nicht sehr schön, da zu C lastig) oder aber du schreibst dir eine Wrapperklasse um WNDCLASS, welche die Initialisierung durchführt (Member für Member).
Mir ist noch eine Möglichkeit eingefallen:
du erzeugst dir eine statische Variable vom Typ WNDCLASS und initialisierst diese mit { 0 } und im Konstruktor kopierst du einfach diese Variable:namespace // anonymer namespace ist besser als static // (im C++ - Standard als "deprecated" bezeichnet) { WNDCLASS st_windowClass = { 0 }; } Window::Window() : windowClass(st_windowClass) { }P.S.
Der Defaultkonstruktor wird für solche Klassen automatisch generiert.
WNDCLASS ist ja eine einfache C-Struktur (auch wenn sie anders heißt
), d.h. die Elemente (meist Zeiger und int/long) werden nicht automatisch auf 0 gesetzt.
-
Also macht
Window::Window() : windowClass() { ; }nicht das gewünschte?
Würd ich dann schade finden, dass das nicht geht.MfG
-
Th schrieb:
P.S.
Der Defaultkonstruktor wird für solche Klassen automatisch generiert.
WNDCLASS ist ja eine einfache C-Struktur (auch wenn sie anders heißt
), d.h. die Elemente (meist Zeiger und int/long) werden nicht automatisch auf 0 gesetzt.C++ kennt keine C-Strukturen - allerdings sind solche POD-Klassen layout-kompatibel zu den entsprechenden C-Strukturen. So oder so - in C++ sind das Klassen, die zwei implizit deklarierte Konstruktoren (Default- und Copy-ctor) haben. Dieser implizit deklarierte Defaultkonstruktor (sofern er erzeugt werden kann, was bei nicht-statische const-Membern und Referenzen nicht der Fall ist), defaultkonstruiert alle Member - bez. genauer value-initialisiert. Value-Initialisierung für Skalare ist aber nichts anderes als die Initialisierung mit 0.
Arrays und Strukturen lassen sich nicht in der Initialisierungsliste initialisieren
Das trifft in dieser Allgemeinheit nicht zu. Defaultkonstruktion ist immer möglich, wenn ein Defaultkonstruktor existiert und aufrufbar ist. Insbesondere im Falle von einfachen POD-Strukturen ist die Lösung simpel: mittels einer Funktion, die einen entsprechenden Konstruktor ersetzt. Das ist im Allgemeinen besser als die Verwendung einer statischen Variable.
-
Window::Window() : windowClass() { ; }Scheint zu funktionieren, aber warum muss man das überhaupt schreiben? Wird nicht schon beim erstellen von windowClass als member der Default-Ctor aufgerufen?
MfG
-

-
Ja, normalerweise mußt du den Default-Ctor nicht explizit aufführen - der wird sowieso ausgeführt, wenn du nichts naderes sagst. Aber es schadet niemandem, wenn du ihn dort nennst (und wenn die Basisklasse keinen Default-Ctor hat, mußt du den richtigen Ctor angeben).
-
ceplusplus@loggedoff schrieb:
Scheint zu funktionieren, aber warum muss man das überhaupt schreiben? Wird nicht schon beim erstellen von windowClass als member der Default-Ctor aufgerufen?
ich würde mal vermuten, dass bei PODs der default-ctor nur erzeugt wird, wenn er explizit angefordert wird.