Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Automatisches Ausnullen per ctor

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
21.03.2011, 20:51 Uhr
shadax



Hallo zusammen,

es geht darum, alle Member-Variablen beim Inzanzieren einer struct (/Klasse) *automatisch* mit default-Werten zu initialiseren, also *nicht* explizit per Elementinitialisierungsliste.

Die struct sähe zunächst beispielsweise so aus:


C++:
struct XXX
{
  int                   i;
  float                 f;
  Foo                   foo;
  Bar *                 bar;
  std::vector<Baz>      bazzes;
  std::vector<Waldo *>  waldos;
  // ...
};



Preisfrage:

Wenn diese struct nun einen default-ctor bekommt, der folgendes macht, was passiert dann genau?


C++:
struct XXX
{
    // ...

    XXX() { static XXX zeroed; *this = zeroed; }
};



Ist es so, dass
C++:
zeroed
beim ersten Aufruf des XXX-ctors tatsächlich (wie gewollt) erst mal komplett genullt wird, *dann* aber sofort der XXX-ctor auf
C++:
zeroed
losgelassen wird, dieser erkennt, dass lediglich die Member-Variablen
C++:
foo
,
C++:
bazzes
und
C++:
waldos
non-POD-Types sind, dementsprechend deren default-ctoren aufruft und danach aus dem vermeintlich rekursiven ctor-Aufruf von XXX wieder rausspringt?

Wenn dem so wäre, dann wäre mein Ziel erreicht, "relativ einfachen" structs "relativ einfach" zu initialisieren.


Grüße,
shadax

Dieser Post wurde am 21.03.2011 um 20:54 Uhr von shadax editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
21.03.2011, 20:56 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


das könnte dir zu einer endlosschleife führen (also rein von der logik her) - ka was in solchen fällen der compiler macht. ansonsten bleiben alle daten auf "irgendwelchen" werten. bei "foo" wird logischerweise der Foo()-Konstruktor aufgerufen, bei den vectoren ebenfalls. nur der rest ist halt uninitialisiert.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
22.03.2011, 11:05 Uhr
TOSHMAX



Wenn du wirklich keine Initialisierungsliste haben willst, könntest du auch folgendes machen:

C++:
struct XXX
{
    int i;
    float f;
    // ...

    XXX() { static XXX defaulted(default_init); *this = defaulted; }

    private:
        struct default_init_t {} static default_init;
        XXX(default_init_t)
                : i(42)
        {
            f = 3.14159265;
            // ...
        }
};

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: