Defaultwert von Klassenattributen?



  • Ich ging immer davon aus, dass wenn ein Objekt als Klassenattribut definiert ist, es bei bei der Erstellung der Klassen immer defaultwerte bekommt.

    Meine Klasse hat einen ähnlichen Typen als Attribut:

    struct Foo
    {
      int myInt;
    }
    

    Jedoch ist myInt nach der Initialisierung ziemlich murks.
    War es nicht so, dass diese Elemente alle zu 0 initialisiert werden?

    Und die Alternative ist aller per Hand zu setzen?

    (Abgesehen von memset und seinen üblen reaktionen 🙂 )



  • memset?! Oh Gooot bitte nicht!

    Schon mal was von Initialisierungsliste gehört?

    class foo
    {
    int i;
    public:
       foo ()
    : i( 0 ) //rat mal, was das ist.. ;)
     {}
    }
    

    EDIT:
    Vor dem Konstruktor werden die Standardkonstruktoren der Objekte der Klasse aufgerufen. Eingebauten Typen haben aber keinen und werden daher auch nicht initialisiert. Das wird also dir überlassen. std::string z.B musst du in der Initialisierungsliste nicht initialisieren, imo solltest du das aber auch machen, auch wenn es nur ein "" ist.



  • Ok, schade, dass ich so hunderte von Elemente initialisieren darf...



  • Seikilos schrieb:

    Ok, schade, dass ich so hunderte von Elemente initialisieren darf...

    Du hast tatsächlich Klassen mit hunderten von Membervariablen? Dann machst du sehrwahrscheinlich etwas falsch.



  • Nexus schrieb:

    Seikilos schrieb:

    Ok, schade, dass ich so hunderte von Elemente initialisieren darf...

    Du hast tatsächlich Klassen mit hunderten von Membervariablen? Dann machst du sehrwahrscheinlich etwas falsch.

    Nein, ich habe viele Klassen, mit vielen Vars und die sind nicht von mir



  • Seikilos schrieb:

    Nein, ich habe viele Klassen, mit vielen Vars und die sind nicht von mir

    Dann hat der Ersteller dieser Klassen also keine Sekunde an den Gedanken verschwendet, einen richtigen Konstruktor zu schreiben?



  • Wenn man die Umstände von vor 15 Jahren und das Detail bedenkt, dass es c Structs sind...nein 🙂



  • C-Structs die keine Funktionen haben, also keine "per-default-.public-klassen" sind, kannst du bedenkenlos mit memset(ptr, 0, sizeof(x)) initialisieren.
    mfg



  • Warum macht ihr es so kompliziert? Null-Initialisierung von Strukturen in C geht wie folgt:

    struct Foo f = { 0 };
    


  • Oder in C++ einfach:

    Foo f = {};
    


  • Bekomme bei beiden ein:
    Error 1 error C2552: 'foo' : non-aggregates cannot be initialized with initializer list.

    Wenn ein struct von nem struct erbt geht es nicht mehr, richtig?

    Vom base struct kann ich es allerdings so machen. Cool

    Danke



  • Ja, genau. Funktioniert nur mit C-style structs. Also nix mit Vererbung.

    Ist aber auch nicht nötig, denn wenn Du selbst eine struct erbst, kannst Du auch einen vernünftigen Konstruktor schreiben.



  • LordJaxom schrieb:

    Ja, genau. Funktioniert nur mit C-style structs. Also nix mit Vererbung.

    Ist aber auch nicht nötig, denn wenn Du selbst eine struct erbst, kannst Du auch einen vernünftigen Konstruktor schreiben.

    Wahrscheinlich ist aber die Vererbung auch schon so vorgegeben....

    Tja - mal wieder ein Beispiel, warum gutes Design wichtig ist (bzw. gewesen wäre).

    Gruß,

    Simon2.



  • Öhm, Wenn A von B erbt und ich eine Instanz von A habe,wie komme ich dann an das base struct B und deren Typen?
    Von mir aus auch im ctor von A



  • Seikilos schrieb:

    Öhm, Wenn A von B erbt und ich eine Instanz von A habe,wie komme ich dann an das base struct B und deren Typen?

    Ähm, vielleicht wie bei Membern von A ? Die vererbte Klasse enthält die Basisklasse als Teil. Explizit (z.B. bei Mehrdeutigkeiten benötigt) könntest du es mit using lösen.



  • Naja, wenn die Klassen so aussehen:

    struct B
    {
      int i;
    };
    
    struct A : public struct B
    {
      A(){
       B = {};
      };
    };
    
    // Oder
    struct A : public struct B
    {
      A(): B({}) {}
    };
    

    Dann krieg ich es nicht geregelt, weder in der Init liste, noch so



  • Seikilos schrieb:

    Dann krieg ich es nicht geregelt, weder in der Init liste, noch so

    Da scheinst du aber nicht lange ausprobiert zu haben. 😉

    struct Base
    {
    	int x;
    	int y;
    };
    
    struct Derived : public Base
    {
    	Derived() : Base()
    	{
    
    	}
    };
    


  • Ach verflucht, das war mir nicht klar, ich dachte leere Klammern würden nichts bringen


Anmelden zum Antworten