Header-only Klasse, wo static Member initialisieren?



  • Hallo!

    Eine allgemeine Stilfrage: Wenn eine Klasse nur im *.h-File implementiert ist (nur inline-Members), aber zusätzlich eine Variable 'static unsigned counter' Member dieser Klasse ist, wo würde man die dann definieren? Im *.h-File geht nicht, denn das würde beim Linken multiple definitions ergeben. Ich sehe nur zwei Möglichkeiten:

    .) Ein extra *.cpp nur für diese eine Variable machen.
    .) Die Variable in dem *.cpp-File definieren, wo das main() steht.

    Gibt es eine bessere Möglichkeit?

    Danke, lg



  • dings schrieb:

    Gibt es eine bessere Möglichkeit?

    "Besser" nicht. Die Variable in einer eigenen cpp-Datein zu definieren ist am besten.

    Man könnte auch noch so etwas machen:

    #ifndef KLASSE_HEADER
    #define KLASSE_HEADER
    
    template<int Dummy>
    class myclass
    {
      static int blah;
    };
    
    template<int Dummy>
    int myclass<Dummy>::blah = 0;
    
    typedef myclass<0> Klasse;
    
    #endif
    

    Die one-definition-rule macht für statische Elemente von Klassentemplates eine Ausnahme. Aber nur deswegen aus der Klasse ein Klassentemplate zu basteln ist IMHO blöd.


  • Mod

    Noch eine Möglichkeit:

    class foo
    {
     public:
      static int& bar(){static int interner_wert=0; return interner_wert;}
    };
    

    Die Methode ist zwar etwas ungewohnt in der Benutzung (weil man () nach dem "Variablen"-Namen schreiben muss)., dafür kann aber nichts mehr schief gehen bezüglich der Definition der Variablen.


Anmelden zum Antworten