statische Klassenelemente
-
Hallo,
ich würde gerne statische Klassenelemente benutzen, erhalte aber beim Kompilieren von
class a { static long count; a(); }; a::a() { count++; }die Meldung "undefined reference to `a::count'", wohingegen
class a { static long count; a() { count++; } };fehlerfrei kompiliert (ich benutze gcc unter Linux). Weiss jemand, woran das liegt und wie ich es behebe?
Des Weiteren bekomme ich beim Kompilieren von
class b { static long count = 0; };die Meldung "ISO C++ forbids in-class initialization of non-const static member ‘count’". Gibt es eine Möglichkeit count zu initialisieren, ohne dass man b zu einer nicht-statischen Klasse machen muss?
-
Header (b.h):
class b { static long count; };Source (b.cpp):
#include "b.h" long b::count = 0;cu André
-
Danke, aber gibt es da auch eine sauberere Lösung? So muss ich ja, wenn ich die Klasse b verwenden will, erstmal
long b::count = 0;ausführen. Das scheint mir gegen das Prinzip der Verkapselung zu verstoßen.
-
Das ist die saubere Lösung und es verstößt keineswegs gegen das Prinzip der Datenkapselung.
-
Mein Problem mit dieser Lösung ist folgendes: Angenommen b hat die Form
class b { static long count; static int f(int x); static int g(int x); };und f und g ändern count und ihr Rückgabewert hängt von count ab.
Dann müsste ein Nutzer der Klasse b darauf achten, dass, bevor er f oder g benutzt, count korrekt als 0 initialisiert ist. Es wäre aus meiner Sicht wünschenswert, wenn diese Initialisierung automatisch geschieht (wie dies bei nicht-statischen Klassen durch den Konstruktor erfolgt).
-
Wenn du es genauso machst, wie asc es dir geschrieben hat, IST count mit 0 initialisiert. Du führst long b::count = 0; ja nicht aus, es ist Teil der Klassendefinitionen in source.cpp.
-
Danke, jetzt verstehe ich.
Aber hat jemand noch etwas zu meinem ersten Problem (der erste Text in diesem Eintrag, Klasse a liefert "undefined reference to `a::count'") zu sagen?
-
ingobulla schrieb:
Danke, jetzt verstehe ich.
Aber hat jemand noch etwas zu meinem ersten Problem (der erste Text in diesem Eintrag, Klasse a liefert "undefined reference to `a::count'") zu sagen?
Eine Klassendefinition besteht nur aus Deklarationen, nicht Definitionen. Um ein Objekt nutzen zu können, muss es aber genau einmal im Programm definiert worden sein. Dazu ist die extra Definition notwendig.
-
Nür für konstante statische Ganzzahlvariablen kannst du in der Deklaration schon einen Wert angeben, ansonsten geht es nur so, wie oben beschrieben.