static member-variable im header initialisieren?!



  • Dravere schrieb:

    Dumme Frage von mir, aber sollte das nicht durch einen Include-Guard behoben werden?

    Nene, damit wird ja nur verhindert, dass die Header-Datei mehrfach in einer Cpp-Datei eingebunden wird. Aber das Problem ist ja, dass die Headerdatei in verschiedenen Cpps eingebunden wird; bzw das ist eigentlich kein Problem, sondern dass in jeder Cpp-Datei dann schlussendlich die Definition der statischen Variable landet 🙂



  • Sofern die const sind, kannst du die Dekleration in der Klasse machen:

    class statictest
    {
    private:
        static const int a = 5;
        static const int b = 2;
    public:
            statictest() {}
            ~statictest() {}
    
            static int dblA(){return a*2;}
            static void prt(){cout << a << ' ' << b << endl;}
    
    };
    


  • drakon schrieb:

    Sofern die const sind, kannst du die Dekleration in der Klasse machen:

    die idee hatte ich auch schon bzw. hat mich das npos vom stl-string auf die idee gebracht, aber da ich leider auch zur laufzeit die werte ändern muss... 😞


  • Administrator

    Badestrand schrieb:

    Dravere schrieb:

    Dumme Frage von mir, aber sollte das nicht durch einen Include-Guard behoben werden?

    Nene, damit wird ja nur verhindert, dass die Header-Datei mehrfach in einer Cpp-Datei eingebunden wird. Aber das Problem ist ja, dass die Headerdatei in verschiedenen Cpps eingebunden wird; bzw das ist eigentlich kein Problem, sondern dass in jeder Cpp-Datei dann schlussendlich die Definition der statischen Variable landet 🙂

    Ach stimmt ja ... mist

    Naja, wenn die static Variablen nicht Konstant sind, dann gebe es natürlich die Möglichkeit, dass du manuell eine Funktion für die Initialisierung aufrufst.

    class XYZ
    {
    public:
        static void init_class();
    };
    

    Oder du machst die Klasse als Singleton, meiner Meinung nach hier die Beste Lösung, wenn du auf das .cpp verzichten möchtest.

    Grüssli



  • Dravere schrieb:

    Naja, wenn die static Variablen nicht Konstant sind, dann gebe es natürlich die Möglichkeit, dass du manuell eine Funktion für die Initialisierung aufrufst.

    class XYZ
    {
    public:
        static void init_class();
    };
    

    geht so leider auch nicht, weil man die static members als eine art globale variable im cpp-file eigentlich anlegen muss.



  • wenn der berg nicht zum propheten kommt, dann...

    verzichte auf die variablen!

    class HeaderOnly
    {
        static int& m_a () { static int a_; return a_; }
        static int& m_b () { static int b_; return b_; }
    
    public:
        static int dblA(){return m_a()*2;}
        static void prt() {cout << m_a() << ' ' << m_b() << endl;}
    };
    

    oder tu dir die arbeit mit dem makefile an.



  • DANKE 👍
    ja das ist die lösung für das problem, weil in m_a() kann ich auch die variablen initialisieren.

    sollte man bei dieser lösung noch überlegungen anstellen bzgl. performance gegenüber einer "normalen" static-member lösung oder wird das eher nicht ins gewicht fallen?



  • War da nicht was mit inline Funktionen und static membern in verschiedenen Ueberseztungseinheiten? Mir ist da irgendwas im Gedaechtnis, dass bei inline Funktionen fuer jede Uebersetzungseinheit eigene statische variablen angelegt werden, so dass m_a nicht immer auf die selbe Variable a_ referenziert. Angabe ohne Gewaehr, vielleicht weiss da jemand genaueres...



  • es ist sichergestellt, dass statische variablen in inline-funktionen immer auf dasselbe objekt verweisen.

    die ausnahme wäre, wenn die funktion interal linkage hätte, was normalerweise bei static -funktionen auch der fall wäre, aber nur, wenn sie nicht im klassenscope deklariert werden.



  • queer_boy schrieb:

    es ist sichergestellt, dass statische variablen in inline-funktionen immer auf dasselbe objekt verweisen.

    Jedoch siehts bei static membern in verschiedenen Übersetzungseinheiten anders aus. Genau wie bei gloables Variablen, ist auch hier die Initalisierungsreihenfolge nicht definiert.

    Edit: Uups, darüber redet ihr ja gar nicht 🙂


Anmelden zum Antworten