static map member initialisieren?



  • Hi leute, ich wollte mal fragen, ob es auch eine möglichkeit gibt, eine statische map innerhalb einer klasse zu initialisieren.
    Also folgendes "kürzen":

    myClass.h:

    class myClass
    {
        private:
            static map<int, int> m_Map;
    };
    

    myClass.cpp:

    map<int, int> myClass::m_Map; // eigentlich private, klappt aber trotzdem
    

    Ich habe auch schon versucht, das ganze im constructor (auch definition in myClass.cpp) mittels einer static bool zu machen, allerdings gibts hier trotzdem eine link error, wegen des unaufgelösten symbols.

    MfG Krauzi.



  • Du kannst die statische Variable nur während der Definition initialisieren, und du darfst die Variable nur einmal in einer Source-Datei definieren. Daher ist die einfache Antwort: Nein.



  • Wenn du bei der Variante mit dem Flag im Konstruktor ein unaufgelöstes Symbol bekommst, hast du wahrscheinlich die Zeile die trotzdem klappt (also die eigentliche Definition) vergessen.



  • achso nene, du hast mich falsch verstanden.
    Wenn ich das mittels

    // map<int, int> myClass::m_Map; 
    // bewusst auskommentiert
    
    myClass :: myClass( )
    {
        static bool initialized;
    
        if( !initialized )
        {
            map<int, int> m_Map;
            initialized = true;
        }
    }
    

    mache, wird trotzdem nicht initialisiert.
    => Es muss also zwingend ein "map<int, int> myClass::m_Map" in der source file, global deklariert werden.



  • Kleiner Trick:

    class myClass
    {
        private:
            static map<int, int>& m_Map()
           {
                static map<int, int> m;
                return m;
           }
    };
    


  • Krauzi schrieb:

    achso nene, du hast mich falsch verstanden.
    Wenn ich das mittels

    // map<int, int> myClass::m_Map; 
    // bewusst auskommentiert
    
    myClass :: myClass( )
    {
        static bool initialized;
        
        if( !initialized )
        {
            map<int, int> m_Map;
            initialized = true;
        }
    }
    

    mache, wird trotzdem nicht initialisiert.
    => Es muss also zwingend ein "map<int, int> myClass::m_Map" in der source file, global deklariert werden.

    Bei map<int, int> myClass::m_Map wird nichts global deklariert, das ist die einzige und korrekte Art, ein statisches Klassenmember zu definieren.
    Und was versprichst du dir von der lokalen Map in Zeile 10? Die gehört da sicher nicht hin.
    Edit: was meinst du überhaupt mit initialisieren? Wenn du nur den Standardkonstruktor aufrufen lassen (oder einen anderen) möchtest - das passiert sowieso automatisch.
    Ich ging davon aus, dass du die Map gleich zu Anfang mit ein paar Werten füllen lassen möchtest.



  • // ========================================================
    // MyClass.hpp
    // KEIN using namespace im Header verwenden!
    
    class MyClass
    {
        static std::map<int, int> myMap;
    };
    
    // ========================================================
    // MyClass.cpp
    
    #include "MyClass.hpp"
    
    // Funktion zur Initialisierung
    std::map<int, int> InitializeMap();
    
    // Definition des Members
    std::map<int, int> MyClass::myMap = InitializeMap();
    

Anmelden zum Antworten