Reihenfolge für Initialisierung statischer Objekte



  • MathiasTemp schrieb:

    b.) Das Zurückgeben einer Referenz auf eine statisches Objekt innerhalb einer
    statischen Funktion war auch meine erste Idee.
    Läßt sich auch wunderbar übersetzen. Es führte jedoch zumindest bei mir
    während der Laufzeit zu Abstürzen.
    Die Version mit dem Pointer hingegen arbeitet zuverlässig.

    Und wie äußerte sich dieser Absturz?

    Die Lösung, wie du sie vorgestellt hast, hat auf jeden Fall einen Nachteil - s_pBluber ist global bekannt und damit könnte auch jemand auf die Idee kommen, es direkt (und uninitialisiert) zu verwenden.



  • War nur für das Beispiel... in meinem Quellcode habe ich das über einen Autopointer innerhalb einer statischen Klassenfunktion gelöst und eine Referenz
    auf das Objekt zurückgeliefert.

    Hmmm mein Mechanismus ist an der Stelle etwas aufwendiger. Meine statischen Funktionen sorgen quasie selbst dafür, dass sie einmal beim Programmstart aufgerufen und dabei die Objekte in einem globalen Container eingetragen werden.
    Wenn ich mich recht entsinne lags daran. 🙂



  • Und wie haben sie dafür gesorgt? Mir fällt da als "Lösung" nur ein, diese Initialisierungsfunktionen aus dem Ctor eines globalen Objekts aufzurufen - und damit stehst du wieder ganz am Anfang, weil du die Reihenfolge nicht kontrollieren kannst, in der die Objekte erzeugt werden.



  • Das Reihenfolge-Problem tritt deswegen nicht auf, weil auch der Container über eine statische Funktion mit Initialisierung angesprochen wird.



  • Häh? Zeig das doch mal mit etwas Code. (entweder du arbeitest mit lokalen statischen Variablen, dann mußt du die zugehörige Funktion selber in Gang setzen - oder du arbeitest mit globalen Objekten, die automatisch initialisiert werden (aber in undefinierter Reihenfolge))



  • Ist doch gar nicht so kompliziert.

    Durch die statischen Funktionen ist garantiert, das alle betroffenen statischen Objekte bereits bei der Initialisierung des ersten statischen Objekts zugreifbar sind.

    Und spätestens wenn die letzte globale Variable initialisiert wird, ist der
    Container vollständig gefüllt.

    😃



  • Und wer sorgt dafür, daß die statischen Funktionen in der richtigen Reihenfolge aufgerufen werden? ('static' bei einer Funktion bedeutet nicht automatisch, daß sie vor der main() einmal aufgerufen wird)

    Wie gesagt, zeig mal etwas Code, damit man sich deine Lösung vorstellen kann.



  • Keine der statischen Funktionen wird von main() aus aufgerufen. Das ist ja der Witz bei der ganzen Sache.

    Das Füllen des Containers erfolgt dezentral beim Initialisieren der statischen Variablen und die Reihenfolge spielt im ersten Schritt keine Rolle, hauptsache der Container ist da.. was ja durch die statische Funktion gegeben ist.

    Ich gehe an der Stelle noch ein bißchen weiter und baue eine Baumstruktur auf. Die Blätter rufen dann jeweils die statische Funktion der Knoten auf und initialisieren somit alle übergeordneten Knoten, falls diese noch nicht vorhanden sind.
    Somit trägt jedes Blatt alle übergeordneten noch nicht eingefügten Knoten mit ein.

    Quellcode gibt es leider nicht, weil ich diesen erst zensieren müsste und das ist mir zu viel Aufwand.



  • MathiasTemp schrieb:

    Keine der statischen Funktionen wird von main() aus aufgerufen. Das ist ja der Witz bei der ganzen Sache.

    Das Füllen des Containers erfolgt dezentral beim Initialisieren der statischen Variablen und die Reihenfolge spielt im ersten Schritt keine Rolle, hauptsache der Container ist da.. was ja durch die statische Funktion gegeben ist.

    Du hast einen globalen vector<> und jede globale Variable trägt sich per push_back() o.ä. in diesen vector ein, habe ich das jetzt soweit erfasst? Wie stellst du da sicher, daß der vector vor den anderen Variablen angelegt wird? Und wie schafft es dieser vector, weitere Initialisierungen in einer vordefinierten Reihenfolge ablaufen zu lassen?

    PS: Wenn dir dein Produktivcode zu umfangreich oder zu persönlich ist, begnpge ich mich auch mit einem gekürzten Psuedocode 😉



  • Na der Container steckt auch wieder in einer statischen Funktion. 😃

    CMengeGeblubber & GetMengeGeblubber ()
    {
      static CMengeGeblubber s_MengeGeblubber;
      return s_MengeGeblubber;
    }
    
    CGebluber & GetGebluberA ()
    {
      static CGeblubber s_GeblubberA;
      static bool       s_bInit = false;
      if (!s_bInit)
      {
        GetMengeGeblubber ().Add (s_GeblubberA);
        s_bInit = true;
      }
      return s_GeblubberA;
    }
    
    CGebluber & GetGebluberB ()
    {
      static CGeblubber s_GeblubberB;
      static bool       s_bInit = false;
      if (!s_bInit)
      {
        GetMengeGeblubber ().Add   (s_GeblubberB );
        s_GeblubberB.SetRelationTo (GetBluberA ()); 
        s_bInit = true;
      }
      return s_GeblubberA;
    }
    

Anmelden zum Antworten