undefined reference bei statischer Klassenvariable



  • Hallo ihr,
    habe da ein Problem bei einem Projekt.
    Möchte eine statische Klassenvariable anlegen und diese verändern.
    Soweit ganz easy. Allerdings tritt da immer ein Fehler beim kompilieren auf.
    .... undefined reference to ....

    Um es mal kurz zu machen hier ein Testprogramm:

    #include <iostream>
    using namespace std;
    
    class Test {
    	private:
    		static int anz;
    	public:
    		static void setAnz(int p_anz);
    };
    //	int Test::anz=3;
    
    void Test::setAnz(int p_anz){
    	anz = p_anz;
    }
    

    ohne die auskommentiere Zeile tritt der Fehler auf:
    Test.cpp:13: undefined reference to `Test::anz'
    collect2: ld returned 1 exit status
    Zeile 13: anz = p_anz;

    Allerdings, wenn ich die auskommentierte Zeile mit rein nehme funktioniert es. In dem Projekt geht das jedoch nicht so einfach.
    Wo liegt der Fehler und wie kann ich dann der Klassenvariablen einen Wert zuweisen?

    ( gcc (GCC) 4.0.4 20060507 (prerelease) (Debian 4.0.3-3) )

    Besten Dank im voraus!

    MgvfG
    Peter



  • int Test::anzahl = 0;

    Du musst die statische Variable noch definieren, du hast sie bis jetzt nur deklariert.



  • Aber wo???

    Oben bei der Deklaration ist das nicht erlaubt (laut C++ ISO)
    nur für const static Variablen, aber die kann ich ja nicht mehr verändern.
    Also muß ich
    int Test::anz=3;
    nochmal außerhalb der Klasse schreiben?
    Denn innerhalb der Klasse darf ich es auch nicht.
    Aber wo schreibe ich das außerhalb der Klasse hin?



  • In irgendeine Implementationsdatei. Sinnvollerweise in der, wo auch die Methodenrümpfe der Klasse zu finden sind.



  • Besten Dank,
    werde es mal testen und mich dann bei euch melden.

    Habe die Variable mit dazugehörigen set- und get-Methoden in einer Header Datei drin.



  • Im Prinzip gilt für die statics genau wie für die Methodenrümpfe die ODR: Wenn Du in mehreren cpp-files dieselbe Headerdatei benutzt wirst Du so (wenn das gepostete der Header ist) Probleme bekommen mit Multiple Definitions.

    Dann heisst es entweder die ausserhalb der Klasse stehenden Methoden als Inline markieren oder anfangen Implementationsdateien dafür zu pflegen 😉



  • Hallo,

    Du könntest eine init()-Methode verwenden, um alle deine Startwerte zu definieren.

    MFG winexec*



  • Hallo LordJaxom,

    genau der Fall mit den multiple definitions trat auf.
    Da der meiste Code vom Projekt her vorgegeben ist (altes Programm), und ich dort nur die eine statische Variable einfügen wollte, werde ich es mal mit inline probieren.

    Vielen Dank euch allen für die schnelle und kompetente Antwort!
    Wenn es klappt, melde ich mich, wenn nicht auch 😉

    Horrido
    Peter


Log in to reply