Link-Fehler mit 'static'-Variablen in Klassen

Uiuiui. Und nochmal C++ :
Ich habe eine Klasse in einer Datei („host.h“) :

class host
{
private:

 static int nrOfObjects; //Diese Variable gibt es nur ein mal pro Klasse...
public:

 void egal(void);
 int auchEgal;

 host(void);
 ~host(void);
};

und eine Datei mit der Implementierung („host.cpp“):

#include "host.h"

host::host(void)
{
}

host::benutzeVariable(void)
{
 norOfObjects++;
 //oder auch host::nrOfObjects++;
}
//usw....

Wenn ich auf die Variable „nrOfObjects“ zugreifen will, geht das beim kompilieren gut - Keine Fehler. Der Linker allerdings spuckt mir dann einen Fehler „LNK2001 - Unresolved External“ raus (MS Visual Studio .NET), woraus dann ein Fehler LNK1120 resultiert. Das Programm wird nicht fertig kompiliert. Ich hab mir auch die Hilfe zum Fehler durchgelesen. In der steht statische Variablen habe „File-scope“, sind also nur im entsprechenden file gültig. Aber die Header-Datei wird doch includiert?!
Ich glaube das ist was grundlegendes, allerdings komm ich einfach nicht drauf…

Für Hilfe/Tips wäre ich extrem dankbar!

KIM

Statische Member-Variablen müssen trotz Deklaration noch einmal explizit definiert werden. Das liegt daran, dass sie im Grunde gar nicht Teil der Klasse werden.

host.cpp:

#include "host.h"

int host::nrOfObjects;

host::host(void)
{
}

host::benutzeVariable(void)
{
 norOfObjects++;
 //oder auch host::nrOfObjects++;
}
//usw....

Hoffe das funktioniert jetzt auch, sonst steh ich mit dem hochtrabenden Geschwafel ganz schön dumm da…

Gruß directxprog

Hoffe das funktioniert jetzt auch, sonst steh ich mit dem
hochtrabenden Geschwafel ganz schön dumm da…

Gruß directxprog

PERFEKT! Ich war einfach zu doof. Habs mit „export“ ausprobiert und so… :smile:
Naja. Danke Dir!

KIM

Hallo Kim!

Die Lösung Deines Problems hat Dir ja schon directxprog geliefert. Noch eine Kleine Anmerkung zum Operator ++ von mir:

Wann immer nicht absolut notwendig solltest du die Postfix-Operatoren (also z.B. x++) vermeiden und stattdessen die Prefix-Schreibweise (++x) verwenden. Grund: Bei den Postfix-Operatoren wird am Stack ein temporäres Object erzeugt (weil ja der Ausdruck als Ergebnis den Wert vor der Ausführung des Operators hat). Das ist in dem Fall bei einem int noch relativ egal, aber viele komplexe Datentypen beinhalten eine (mehr oder weniger sinnvolle) Implementierung dieser Operatoren, und da kann’s schon mal vorkommen, dass da einige KB oder gar MB kopiert werden müssen.

Gruß,
TheBeast

Wow! Immer wieder beeindruckend, was man in diesem Forum noch alles lernen kann…