Linkerfehler bei statischer Elementfunktion



  • Hi,

    ich komme einfach nicht darauf was ich falsch mache 😞
    Ich bekomme folgende Fehlermeldung

    undefined reference to `Klasse::statisch' 
    collect2: ld returned 1 exit status
    
    #include <iostream>
    
    class Klasse
    {
    public:
        Klasse(int d)
            : dynamisch(d)
        {
        }
    
        int get_dynamisch() const
        {
            return dynamisch;
        }
    
        static int get_statisch()
        {
            return statisch;
        }
    
    private:
        static int statisch;
        int dynamisch;
    };
    
    int main()
    {
        std::cout << "statisch=" << Klasse::get_statisch() << std::endl;
    }
    


  • Dir fehlt ein

    int Klasse::statisch = 0;
    

    außerhalb der Klassendeklaration.



  • Danke das war es. Wenn das Element eh definiert werden muss warum ist das nicht gleich innerhalb der Klassendefinition möglich?



  • Für konstante, statische, integrale Typen ist es erlaubt. Ich glaube es geht nicht, weil sonst die Variable bei jedem Konstruktor-Aufruf zurückgesetzt werden würde.(Deswegen darf man statische Variablen auch nicht im Konstruktor initialisieren)



  • cppfrager schrieb:

    Danke das war es. Wenn das Element eh definiert werden muss warum ist das nicht gleich innerhalb der Klassendefinition möglich?

    Weil du irgendwo ein Stück Speicher für die Variable brauchst. Wann und wo sollte der Compiler den Speicher anlegen, wenn es in der Klassendefinition steht? Es darf ja nicht in jeder aus einem .cpp generierten Objektdatei ein eigener Bereich angelegt werden. Deshalb muss man in einer .cpp sagen: hier hin.

    Ein Fehler der gerne von Anfängern gemacht wird: die Definition auch in den Header schreiben. Das führt dann zu dem oben beschriebenen Effekt und der Linker beschwert sich über ein mehrfach definiertes Symbol.

    Lars


Anmelden zum Antworten