linkerfehler: statische variable mehrfach definiert - trotz einmaliger definition
-
folgender fall:
der einfachheit halber in einem headerfile (kat.h)
#ifndef T_ #define T_ class Base{ public: virtual void test()=0; }; class Fou:public Base{ public: void test(){} Fou(){ x++; } static int x; }; int Fou :: x=9; #endif
und hier die cpp dazu:
#include <iostream> using namespace std; #include "kat.h" int main(){ Base *pFou=new Fou[20]; cout<<Fou::x; }
bis hierhin klappt alles wunderbar. er gibt für Fou::x die 29 aus.
so soll es sein.nun mein aufgetretenes problem:
wenn ich eine implementierungsdatei anlege, in der ich zum bleistift die test des Fou redefinieren will, gibt es den linkerfehler:
mp.obj : error LNK2005: "public: static int Fou::x" (?x@Fou@@2HA) bereits in kathrin.obj definiert
Debug/kathrin.exe : fatal error LNK1169: Ein oder mehrere mehrfach definierte Symbole gefunden
Fehler beim Ausführen von link.exe.nun meine frage: ist es immer so, daß ich bei vorkommen statischer variablen inline implementieren muss? mich macht das grad unsicher.
gibt es einen denkfehler?
das eigentliche projekt war noch etwas komplexer. habe mal nur den wichtigsten fakt rausgenommen.
-
int Fou :: x=9;
das gehört afaik in die .cpp, nicht in die .h
Ist ja eine Definition.
-
Jo das würde ich auch sagen. Kann es sein, dass du den Haeder mehrfach includierst? Am besten wirklich die Definition in die .cpp packen, oder #ifndef/#endif verwenden.
-
der teufel steckt im detail...
stimmt, die definition muss mit in die implementierung.
ok, ich lerne: entweder alles inline, oder alles "outline".
problem war im projekt, daß es mehrere header gab.. da war die übersicht verloren.
thanks.
-
elise schrieb:
das bei den statischen variablen die definition in den header gehört, ok.
Nein, Definitionen haben in Headern nichts verloren. Die Definition von Fou::x gehört in die Implementierungsdatei.
-
ok ok
habs verstanden (gedankenwirrwarumeckegedachtunsinngedacht)
thread closed ~~~