Private, statische Klassenvariable



  • Hallo zusammen,
    ich habe eine kurze frage zu private static Variablen:
    Ob das sinnvoll ist das so zu machen sei mal dahingestellt. Es ist ein Teil einer alten Klausuraufgabe. Daher habe ich auch keine Kapselung in .h und cpp vorgenommen, sondern schreibe alles in die .cpp.

    class Verwaltung {
    private:
        static ImmoObjekt *IMMOOBJEKTE[N];
    public:
        Verwaltung(){
            objektanzahl = 0;
            for(int i = 0; i<N;i++){
                IMMOOBJEKTE[i] = NULL;
            }
        }
    

    Jedes mal wenn ich im Konstruktur auf das Feld vom Typ *ImmoObjekt zugreifen will meldet mir der Compiler: undefined reference to `Verwaltung::IMMOOBJEKTE'.

    Das geschieht allerding nur wenn IMMOOBJEKTE statisch ist. Nicht statisch funktioniert es einwandfrei.
    Da ich in der selben Klasse wie die definition bin, habe ich auch von Klassenname::Variable abgesehen (was auch nicht weiterhilft).

    Hat jemand eine Idee?


  • Mod

    MatzeOneOSix schrieb:

    Hat jemand eine Idee?

    static Member müssen auch irgendwo definiert werden (d.h. irgendwo muss Speicherplatz für die Variable erzeugt werden). Bisher hast du sie nur deklariert(d.h. bekannt gemacht, dass es irgendwo Speicherplatz gibt, der diesen Namen trägt)*. Und das Definieren solltest du übrigens nicht im Header tun, denn dann würdest du logischerweise Mehrfachdefinitionen bekommen, wenn der Header mehrfach benutzt wird (und das ist der Sinn von Headern).

    Die normalen Member werden erzeugt, wenn du die Klasse tatsächlich instanzierst.

    *: Deinen Fehler meldet auch nicht der Compiler, sondern der Linker. Dem Compiler reicht es, wenn er weißt, dass irgendwo diese Variable existiert. Aber als der Linker dein Programm zusammenbasteln wollte, hat er sie nirgends finden können.



  • Vielen Dank schonmal!

    Wie müsste das Feld vereinbart werden damit es funktioniert?
    Denn, sobald ich static ImmoObjekt *IMMOOBJEKTE[N]; außerhalb einer Klasse setze kommt keine Fehlermeldung. Nur, wie hier, innerhalb der Klasse.


  • Mod

    ImmoObjekt Verwaltung::*IMMOOBJEKTE[N];
    

Anmelden zum Antworten