Frage zu Initialisierungsliste



  • Wie kann ich alle Elemente eines struct initialisieren (auf 0 setzen), wenn diese stuct Elementeiner Klasse ist. Geht das irgendwie per initialisierungsliste?

    typedef struct Tiere
    {
    	int Hunde;
    	int Schweine;
    	int Kühe;
    }
    
    class Zoo
    {
    public:
    	Zoo() : meineTiere(0) {}  //<----so gehts ja leider nicht
    
            Tiere meine_Tiere;
    }
    


  • Ja ok man könnte natürlich jedes einzelne Element der struct im Konstruktor auf 0 setzen, nur obs halt auch in der Initliste geht?

    Danke



  • Du kannst der struct auch einen Default-Ctor geben. Aber ansonsten sollte Zoo() : meineTiere() {...} eigentlich dafür ausreichen.



  • Bei hinreichend neuem Compiler reicht letzteres definitiv aus 😉

    Erläuterung: Tiere ist ein POD, wird daher standardmäßig wie schon festgestellt garnicht initialisiert. Wenn man eine solche Struktur aber default-initialisiert (also mit leeren Klammern), werden alle Mitglieder rekursiv auch default-initialisiert. Und das bedeutet für alle integralen Typen, dass sie eine in den Zieltyp konvertierte 0 als Wert erhalten.



  • Tatsache. Danke 🙂

    gibts diesen default Konstruktor für structs auch schon in C? oder nur wenn man mit C++ Compiler übersetzt?

    Denn in meinem klugen 1000 seitigen C Buch steht nüscht von Konstruktoren bei structs 😞



  • In C gibt es keine Konstruktoren. Da kann man Objekte auch nicht mit Klammern initialisieren. Aber einen Trick gibt's selbst da:

    Tiere meineTiere = { 0 };
    

    Bei dieser Initialisierung erhalten alle nicht aufgeführten Elemente auch einen Wert von 0. Leider darf man meines Wissens in C keine leeren Initialisiererklammern angeben, so dass - damit das funktioniert - das erste Strukturelement selbst keine Struktur sein darf.

    EDIT:
    Siehe CStoll, die Syntaxen für die Initialisierungen sind nicht mit den Begriffen zu vermischen - Default-Initialisierungen an sich gibt es auch in C, aber man kann sie nicht in Fällen erzwingen wo sie nicht vorgesehen ist.



  • Diese Default-Initialisierung gab's auch schon für C - dort wurde sie allerding nur für globale und statische Variablen angewendet.


Anmelden zum Antworten