CList als static deklarieren



  • Hi!

    Kann man eine CList als static deklarieren, so dass ich in jeder Instanz meiner Klasse die selbe Liste zur Verfügung habe?

    Ich habe es mal ganz stupide so probiert:

    static CList <myLabel, myLabel&> m_labelList;
    

    hat natürlich nicht funktioniert...

    error LNK2001: Nichtaufgeloestes externes Symbol "private: static class CList<struct myLabel,struct myLabel &> CLabelLayer::m_labelList" (?m_labelList@CLabelLayer@@0V?$CList@UmyLabel@@AAU1@@@A)
    

  • Mod

    Klar geht das. Du musst in der Implemntierung Deiner Klasse aber eben auch eine Initialisierung und Definition durchführen

    // In der CPP
    ...
    CList <myLabel, myLabel&> CLabelLayer::m_labelList;
    ...
    
    // In Deiner Klasse 
    ...
    static CList <myLabel, myLabel&> m_labelList;...
    


  • Ich mache noch was falsch...

    LabelLayer.h

    ...
    class CLabelLayer : public CLayer
    {
    public:
    	...
    	CLabelLayer();
    	virtual ~CLabelLayer();
    private:
    	...
    	static CList <myLabel, myLabel&> m_labelList;
    	...
    };
    ...
    

    LabelLayer.cpp

    ...
    CLabelLayer::CLabelLayer()
    {
    	...
    	CList <myLabel, myLabel&> CLabelLayer::m_labelList;
    }
    ...
    

    Bekomme dann diesen Fehler:

    error C2655: 'm_labelList' : Definition oder Neudeklaration im aktuellen Gueltigkeitsbereich unzulaessig
    


  • Hallo,

    nicht die :: in der Klasse schreiben:

    CLabelLayer::CLabelLayer()
    {
        ...
        static CList <myLabel, myLabel&> m_labelList;
    }
    

    nur ausserhalb:

    CList <myLabel, myLabel&> CLabelLayer::m_labelList;
    

    MfG,

    Probe-Nutzer



  • sollte heissen, im Konstruktor darfst du die statische m_labelList nicht noch einmal definieren, also das hier

    CLabelLayer::CLabelLayer()
    {
        ...
        static CList <myLabel, myLabel&> m_labelList;
    }
    

    ist falsch (habe CLabelLayer:: versehentlich entfernt)

    MfG,

    Probe-Nutzer



  • Jetzt weiß ich gar nicht mehr was ich wo hinschreiben muss.
    Ich habe die 2 Klassen, die die Liste brauchen, jetzt zusammengefasst, so dass ich die Liste nicht mehr als statisches Element brauche.

    Trotzdem vielen Dank für eure Mühe.



  • müssen static Funktionen nicht als public deklariert werden?



  • Na, das wichtige bei statischen Membern ist halt, dass sie der Klasse bekannt sein müssen und müssen demnach als Deklaration in der Header Datei stehen.

    //MyClass.h
    class MyClass
    {
       static CList <myLabel, myLabel&> m_labelList;
    }
    

    Aber da dieser Member statisch sein soll, muss er auch existieren, ohne das eine Instanz deiner Klasse erstellt wird. Dafür musst Du dann in deiner .cpp Datei sorgen. Das ist dann kein normaler Member deiner Klasse. Du musst den dann ausserhalb der Klassensichtbarkeit definieren (also ausserhalb deines Konstruktors).

    //MyClass.cpp
    #include "MyClass.h"
    
    CList <myLabel, myLabel&> CLabelLayer::m_labelList;
    
    CLabelLayer::CLabelLayer()
    {
       // Konstruktor Code
    }
    
    //
    // weitere Memberfunktionen
    //
    ...
    

Log in to reply