Neudefinition statischer Variablen verhindern
-
Hallo,
ich habe folgendes Problem:
In einer Header-Datei habe ich eine abstrakte Klasse mit 7 statischen Variablen.
Diese werden direkt in der Header-Datei außerhalb der Klasse definiert.
Ich möchte die Header-Datei jetzt in zwei CPP-Dateien einbinden, da beide auf die Klassen zugreifen müssen.
Leider hab ich jetzt das Problem, dass die statischen Variablen dadurch zweimal definiert werden, was dann zu einem LNK2005-Fehler führt: Ist bereits definiert.
Kann ich also mit irgendeinem Präprozessor-Befehl nachprüfen, ob die Definition bereits stattgefunden hat?
-
Nein, du solltest die statischen Variablen in einer cpp-Datei definieren.
-
Bashar schrieb:
Nein, du solltest die statischen Variablen in einer cpp-Datei definieren.
Das würde zwar den Fehler lösen, aber ich müsste - wann immer ich die Header-Datei in ein anderes Projekt einbinden wollte - die statischen Variablen dort auch definieren. Gibt es nicht vielleicht eine andere Lösung?
-
du linkst die cpp einfach mit zu deinem Projekt.
-
Ich kenne zwei mehr oder weniger grässliche Workarounds:
-
Mach die Klasse zu einem Template.
-
Pack die static Variablen in eine Hilfs-Struct, und besorg dir einen Zeiger/Referenz auf die Hilfs-Struct über eine inline Funktion, die die Instanz dann als function-local-static enthält
class Foo { struct StaticsDummy { int foo; int bar; }; static StaticsDummy& Statics() { static StaticsDummy s = {}; return s; } void f() { Statics().foo++; Statics().bar--; } };
-
-
Taeli schrieb:
Kann ich also mit irgendeinem Präprozessor-Befehl nachprüfen, ob die Definition bereits stattgefunden hat?
Nö, denn PP-Definitionen gelten nur für jeweils eine Übersetzungseinheit.
-
Sone.
Einfach mal die Klappe halten wenn man nix zu sagen hat.
-
Was genau sind das denn für statische Variablen und wieso müssen die in deiner abstrakten Klasse sein? Bei statischen Variablen wär ich rein aus Prinzip immer eher skeptisch, ganz besonders in einer abstrakten Klasse. Nachdem die offenbar sowieso grad Probleme machen, wäre vielleicht ein guter Zeitpunkt, nochmal drüber nachzudenken...
-
In einer Header-Datei habe ich eine abstrakte Klasse mit 7 statischen Variablen.
Diese werden direkt in der Header-Datei außerhalb der Klasse definiert.Sieht dein Code etwa so aus ?
// ABC.h static int Zahl1; static int Zahl2; //...Wenn ja probiere doch mal:
// ABC.h extern int Zahl1; extern int Zahl2; // ABC.cpp int Zahl1; int Zahl2;