Initialisierungsreihenfolge bei statischen Variablen und Konstanten in Klassen



  • Ich habe ein Problem mit der Initialisierungsreihenfolge von statischen Konstanten und Variablen in Klassen, die in verschiedenen Dateien liegen. Hier ein Beispielcode:

    Test.h

    #ifndef TEST_H
    #define TEST_H
    
    class Test
    {
    public:
    
    	static int EchteKonstante;
    	static int Pseudokonstante;
    
    private:
    
    	Test();
    
    	static Test m_Test;
    };
    
    #endif
    

    Test1.cpp

    #include <iostream>
    #include "Test.h"
    
    using namespace std;
    
    Test Test::m_Test;
    
    Test::Test()
    {
    	cout << "Konstruktor:\n";
    	cout << "Echte Konstante: " << EchteKonstante << "\n";
    	cout << "Pseudokonstante: " << Pseudokonstante << "\n";
    }
    

    Test2.cpp

    #include <cstdlib>
    #include "Test.h"
    
    int Test::EchteKonstante = -7;
    
    int Test::Pseudokonstante = rand() + 1;
    

    Main.cpp

    #include <iostream>
    #include "Test.h"
    
    using namespace std;
    
    int main()
    {
    	cout << "Main:\n";
    	cout << "Echte Konstante: " << Test::EchteKonstante << "\n";
    	cout << "Pseudokonstante: " << Test::Pseudokonstante << "\n";
    }
    

    Ich hätte gedacht, dass Konstanten vor Variablen initialisiert werden. Bei der echten Konstante, die also wirklich mit einem bekannten Wert initialisiert wird, ist das auch der Fall, aber bei der Pseudokonstante, die ihren Wert aus einer Funktion holt, nicht. Die Ausgabe ist:

    Konstruktor:
    Echte Konstante: -7
    Pseudokonstante: 0
    Main:
    Echte Konstante: -7
    Pseudokonstante: 42
    

    Wenn ich den Quellcode in Test1.cpp und Test2.cpp austausche, funktioniert es:

    Konstruktor:
    Echte Konstante: -7
    Pseudokonstante: 42
    Main:
    Echte Konstante: -7
    Pseudokonstante: 42
    

    Heißt das also, dass sich die Initialisierungsreihenfolge nach der Reihenfolge der Quellcodedateien in der Projektdatei richtet? Ich brauche nämlich die Pseudokonstante im Konstruktor, die beiden müssen jedoch trotzdem in verschiedenen Dateien implementiert werden. (Weil die Variable und der Konstruktor plattformunabhängig sind, während sich der Wet der Pseudokonstante in meinem richtigen Programm je nach OS und Implementierung unterscheidet und ich möchte das eben trennen.) Und ich kann mich ja nicht darauf verlassen, dass der Quellcode immer in einer bestimmten Reihenfolge kompiliert wird. Was kann ich tun, um auf Codeebene sicher zu stellen, dass die Pseudokonstante vor der Testvariable initialisiert wird?


  • Mod


Log in to reply