statische Klassenelemente



  • class Game
        {
        public:
    
            unsigned x;
            unsigned y;
            unsigned speed_x;
            unsigned speed_y;
            Uint8 alpha;
            unsigned delay;
            DIRECTION direction;
    };
    

    Wenn ich eins dieser Klassenelemente als static deklariere, dann bekomme ich folgende Fehlermeldung:

    Nichtaufgeloestes externes Symbol "private: static unsigned char  Game::alpha" (?alpha@Game@@0EA)
    Debug/wcc_tobi_x.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise
    

    Was ist falsch?



  • Hallo,
    ich denke mal du hast folgende Situation.

    class Game
    {
        public:
           static int test;
           //...
    };
    
    // irgendwo im Programm. Zum Beispiel in main
    
    int main()
    {
         // wird kompiliert, aber nicht gelinkt, da für test noch kein Speicher angelegt wurde.
         Game::test = 5; 
    }
    

    Die Lösung ist einfach. Du mußt test noch definieren (bzw. initialisieren).

    // in der Klassendefinition (z.B. Game.cpp)
    int Game::test = 0;
    


  • Es fehlt Speicher!

    Wenn Du in einer Klasse eine normale Variable anlegst, so wird dafür Speicher bereitgestellt, sobald Du eine Objektinstanz anlegst, also mit einer dieser Möglichkeiten:

    DeineKlasse Instanz;
    DeineKlasse* pInstanz = new DeineKlasse();
    

    Anders sieht das aber bei static-Membervariablen aus, diese existieren unabhängig vom Objekt, also muß bereits für die reine Klassendefinition irgendwo Speicher bereitgestellt werden, wo der Wert abgelegt werden kann.

    Das macht man üblicherweise in der .cpp-Datei der Klassenimplementation:

    die h-Datei:

    class DeineKlasse
    {
    ...
    private:
       int m_Wert; // normale Membervariable
       static int ms_Counter;
       static POINT ms_Point;
    };
    

    in der .cpp-Datei steht dann irgendwo:

    #include "DeineKlasse.h"
    
    int DeineKlasse::ms_Counter = 0;
    POINT DeineKlasse::ms_Point;
    

    Diese Zeilen stehen eigenständig mit dabei. Am Ende kann man hinter dem = einen Initialwert angeben. Nun wurde Speicher für diese Variablen bereitgestellt und der Fehler wird verschwinden, weil der Linker nun diesen Speicherort verwenden kann.


Anmelden zum Antworten