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?


  • Mod

    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.


Anmelden zum Antworten