Vererbungsproblem



  • Ich hätte gerne eine virtuelle Basisklasse mit einem Counter, dh jedes mal wenn ein Objekt der Klasse angelegt wird, soll der Counter hochgezählt werden.

    class Basis
    {
    public:
        static int COUNTER;
        virtual ~Basis(){};
        virtual doSomething()=0;
    };
    

    Nun ist es mir aber anscheinend nicht möglich auf den Counter zuzugreifen:

    #include "basis.h"
    
    int main()
    {
        Basis::COUNTER = 0;
    }
    

    -> undefined reference to Basis::COUNTER

    Woran mag das liegen?



  • class Basis 
    { 
    public: 
        static int COUNTER; 
    
    }; 
    int Basis::COUNTER = 0;
    
    int main()
    {
    	Basis::COUNTER = 1; 
    	return 0;
    }
    


  • Du musst in deiner Header-Datei wie im Post oben drüber schon beschrieben, die statische variable noch initalisieren.

    Wird häufig vergessen;-)



  • fr33g schrieb:

    Du musst in deiner Header-Datei wie im Post oben drüber schon beschrieben, die statische variable noch initalisieren.

    Nicht im Header sondern in der .cpp, sonst hagelt es linkererrors, wenn der Header öfters als 1x eingebunden wird 😉



  • Ja da hast du recht 🙂
    Sorry hatte das grad verwechselt um nicht zu sagen mich vertippt 😉 😃



  • Werden static-variablen nicht mit 0 initialisiert?



  • [quote="oO"]Werden static-variablen nicht mit 0 initialisiert?[/quote

    Ehm ja hat jemand was anderes gesagt?
    Schau doch mal oben in dem Code Beispiel.

    int Basis::Counter = 0;
    

    das danach in der main ist ja keine initialisierung, ist ja dann ne normale zuweisung, man könnte auch sagen sie wird neu definiert.



  • Das "in der main" ist einfach eine Zuweisung.
    Eine Zuweisung ist keine Definition, auch keine Neudefinition.

    Das was nötig ist, damit statische Variablen "da" sind, ist eine Definition. Ob dabei ein Wert zum Initialisieren angegeben wird oder nicht ist egal.

    Und ja, statische und globale Variablen werden zuerst mal "zero initialized", bevor irgendwas anderes passiert. Auch wenn man im Code nichts diesbezüglich schreibt.


Anmelden zum Antworten