Stl Liste übergeben bzw. global



  • Hallo, ich hab mal wieder ein Problem, bei dem mir vielleicht jemand weiterhelfen kann.

    Ich möchte eine Liste aus Objekten ertellen, und diese dann weitergeben, damit sie dort verarbeitet wird. Dabei entsteht folgendes Problem:

    H-File

    #ifndef	light_h
    #define light_h
    
    #include "main.h"
    
    class Light
    {
    public:
    		Light();
    		~Light();
    private:	
    //list<Light*>  test;  Hier funktioniert es nicht
    };
    
    #endif
    

    CPP-File

    #include "light.h"
    
    //list<Light*>  test;  //Hier funktioniert es
    
    Light::Light()
    {
        list<Light*>  test;  //Hier funktioniert es
    }
    
    Light::~Light()
    {
    
    }
    

    using namespace std sowie #include <list> wurde alles in der main.h erledigt. Dass ich hier eine Liste aus "eigenen" Objekten erstell dient nur dem Beispiel.
    Es funktioniert also problemlos die Liste im cpp file zu erstellen. Allerdings habe ich dann keine möglichkeit die Liste von Außen zugänglich zu machen, was ich jedoch. Wie kann ich die Liste als private membervariable anlegen, so dass ich über Funktionenn zugreifen kann?
    Es würde mir im Prinzip schon reichen wenn es mir gelänge die Liste global zu machen, aber ich bekomme das Teil nicht in ein h-File, egal wie.

    Gruß

    falcon



  • "geht nicht" ist eine ziemlich vage Fehlerbeschreibung 😉 Worüber beschwert sich denn der Compiler?

    PS: Wenn du ein globales Objekt überall verwenden willst - versuch's mal mit 'extern'.



  • light.hpp

    #include <list>
    // KEIN!!! using namespace std im header!!!
    class Foo {
        std::list<Foo*> foolist;
    };
    


  • Wenn du deine Liste in der Klasse privat hast, dann kannst du auch in der cpp-Datei mit den Elementfunktion von Light ganz normal auf die Light-Liste zugreifen.

    Wenn du auch noch außerhalb damit was machen willst, dann so:

    public:
       const std::list<Light*>& getList() const { return test; }
    


  • hm

    Vielen Dank erst mal.

    In dem kleinen Beispiel funktioniert es tatsächlich.

    Die Ursache scheint wohl tiefer zu liegen.
    In meiner eigentlichen Anwendung lassen sich nur solche Listen in hpp-Files erstellen , welche aus Klassen bestehen, die meine main.h NICHT inkludiert haben. Warum auch immer. Werde schreiben wenn ich es rausgefunden hab.

    Gruß

    falcon



  • Rück mal die Fehlermeldungen raus



  • falcon schrieb:

    Die Ursache scheint wohl tiefer zu liegen.
    In meiner eigentlichen Anwendung lassen sich nur solche Listen in hpp-Files erstellen , welche aus Klassen bestehen, die meine main.h NICHT inkludiert haben. Warum auch immer. Werde schreiben wenn ich es rausgefunden hab.

    Da würde mich doch mal interessieren, wie deine main.h aussieht (und immer noch: Wie lautet denn die Fehlermeldung?)



  • Hier die Klasse, aus welcher die Liste bestehen soll

    Leider handelt es sich um eine WinMain Anwendung (Sorry ist dann wohl mittlerweile das falsche Forum)

    #ifndef light_h
    #define light_h
    
    #include "main.h"
    
    class Light
    {
    private:
    
    	D3DLIGHT9	Licht;
    	LPCTSTR		LichtName;
    	bool		status;
    
    public:
    
    	Light(int ID,LPCTSTR name);
    	~Light(void);
    
    	int			GetIndex();
    
    	inline D3DLIGHT9	GetLight(){return Licht;}
    	inline bool			GetStatus(){return status;}
    	inline void			SetStatus(bool stat){status=stat;}
    
    	inline void		SetDiffuse(float r,float g,float b,float a){Licht.Diffuse.r=r; Licht.Diffuse.g=g; Licht.Diffuse.b=b; Licht.Diffuse.a=a;}
    	inline void		SetDiffuse(D3DCOLORVALUE diffuse){Licht.Diffuse=diffuse;}
    	inline void		SetSpecular(float r,float g,float b,float a) {Licht.Specular.r=r; Licht.Specular.g=g; Licht.Specular.b=b; Licht.Specular.a=a;}
    	inline void		SetSpecular(D3DCOLORVALUE specular){Licht.Specular=specular;}
    	inline void		SetAmbient(float r,float g,float b,float a){ Licht.Ambient.r=r; Licht.Ambient.g=g; Licht.Ambient.b=b; Licht.Ambient.a=a;}
    	inline void		SetAmbient(D3DCOLORVALUE ambient){Licht.Ambient=ambient;}
    
    	inline void		SetPosition(float x,float y, float z){Licht.Position.x=x;Licht.Position.y=y;Licht.Position.z=z;}
    	inline void		SetPosition(D3DVECTOR position){Licht.Position=position;}
    	inline void		SetDirection(D3DVECTOR direction){Licht.Direction=direction;}
    	inline void		SetDirection(float x,float y, float z){Licht.Direction.x=x;Licht.Direction.y=y;Licht.Direction.z=z;}
    
    	inline void		SetRange(float range){Licht.Range=range;}
    	inline void		SetFalloff(float falloff){Licht.Falloff=falloff;}
    
    	inline void		SetAttenuation0(float attent){Licht.Attenuation0=attent;}
    	inline void		SetAttenuation1(float attent){Licht.Attenuation1=attent;}
    	inline void		SetAttenuation2(float attent){Licht.Attenuation2=attent;}
    
    	inline void		SetTheta(float theta){Licht.Theta=theta;}
    	inline void		SetPhi(float phi){Licht.Phi=phi;}
    
    	inline D3DCOLORVALUE		GetDiffuse(){return Licht.Diffuse;}
    	inline D3DCOLORVALUE		GetSpecular(){return Licht.Specular;}
    	inline D3DCOLORVALUE		GetAmbient(){return Licht.Ambient;}
    	inline D3DVECTOR			GetPosition(){return Licht.Position;}
    	inline D3DVECTOR			GetDirection(){return Licht.Direction;}
    	inline float				GetRange(){return Licht.Range;}
    	inline float				GetFalloff(){return Licht.Falloff;}
    	inline float				GetAttenuation0(){return Licht.Attenuation0;}
    	inline float				GetAttenuation1(){return Licht.Attenuation1;}
    	inline float				GetAttenuation2(){return Licht.Attenuation2;}
    	inline float				GetTheta(){return Licht.Theta;}
    	inline float				GetPhi(){return Licht.Phi;}
    };
    #endif
    

    Zugehörige cpp File

    #include "light.h"
    #include "main.h"
    
    const int Index=0;
    
    Light::Light(int ID,LPCTSTR name)
    {
    	LichtName=name;
    	SetStatus(true);
    	switch (ID)
    	{
    	case 0:
    		{
    			ZeroMemory(&Licht,sizeof(D3DLIGHT9));
    			Licht.Type=D3DLIGHT_POINT;
    			//mApp.GetD3Ddevice()->SetLight(Index,&Licht);
    			g_pLogfile->fTextout(BLUE,"Punktlicht wurde erstellt");
    			break;
    		}
    	case 1:
    		{
    			ZeroMemory(&Licht,sizeof(D3DLIGHT9));
    			Licht.Type=D3DLIGHT_DIRECTIONAL;
    			mApp.GetD3Ddevice()->SetLight(Index,&Licht);
    			break;
    		}
    	case 2:
    		{
    			ZeroMemory(&Licht,sizeof(D3DLIGHT9));
    			Licht.Type=D3DLIGHT_SPOT;
    			mApp.GetD3Ddevice()->SetLight(Index,&Licht);
    			break;
    		}
    		break;
    	}
    
    }
    
    Light::~Light()
    {
    }
    
    Light::GetIndex()
    {
    	return Index;
    }
    

    Die main.h

    #ifndef main_h
    #define main_h
    
    #include	<windows.h>
    #include	<winuser.h>
    #include	<d3d9.h>
    #include	<d3dx9.h>
    
    #include <list>
    
    #include "idfile.h"
    #include "application.h"
    #include "primitive.h"
    #include "light.h"
    #include "settings.h"
    #include "lightbox.h"
    #include "Logfile.h"
    
    using namespace std;
    
    LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
    bool StartApplication();
    
    typedef struct MAINSETTINGS{
    	D3DDISPLAYMODE			Displaymode;
    	UINT					Adapter;
    	UINT					Width;
    	UINT					Height;
    	BOOL					Windowed;
    	D3DFORMAT				DepthStencil;
    	D3DFORMAT				BackBufferFormat;
    	DWORD					VertexProcessing;
    	D3DMULTISAMPLE_TYPE		MultiSampleType;
    	UINT					Anitrosopy;
    }RXSETTINGS;
    
    extern MAINSETTINGS		MainRenderSettings;
    extern Application		mApp;
    extern Settings			set;
    extern PCOPYDATASTRUCT	pSettingsCopy;
    extern HWND				MainHWND;
    extern HINSTANCE		hInst;
    
    #endif
    

    Zum Fehlercode

    Er kreidet einfach scheinbar wahlos unmengen von Varibalen in allen möglichen Klassen an, die ansonsten wunderbar funktionieren. Hinzu kommen noch ca 30 mal "es fehlt ; vor}" was natürlich ebenfalls Schwachsinn ist.



  • Hab den Fehlercode jetzt nicht abgedruckt, da er a) sehr lang ist
    b) ausschließlich alles mögliche ankreidet was normalerweise funktioniert. kann das aber gerne nachholen.



  • Hallo,

    wenn Du es denn besser weisst als Dein Compiler, warum fragst Du dann ? ;o)

    Regel: Der Compiler hat immer recht, weil er soll es ja machen. Ein fehlendes ; am Ende weisst auf falsches Includieren hin.

    So sieht man z.B. das light.h und main.h sich gegenseitig brauchen.

    Spiel mal manuell Precompiler und setze die Daten passend ein und schau ob der Compiler mit den Fehlermeldungen nicht doch recht hat.



  • Hi

    So war das natürlich nicht gemeint, sorry. 😉
    Ich konnte die Zahl der Fehlermeldungen in der Tat dadurch reduzieren, dass ich die main.h in alle Files includiert habe (auch in jene, die sie eigentlich nicht brauchen), was aber zugegebenermaßen eher das Ergebnis von ausprobieren war.

    Ich bekomme nun noch folgende Meldungen:

    application.cpp(21): warning C4267: 'return': Konvertierung von 'size_t' nach 'int', Datenverlust möglich
    test.cpp(12): fatal error C1004: Unerwartetes Dateiende gefunden
    Logfile.h(44): error C3861: 'Text': Bezeichner wurde auch mit einer argumentbezogenen Suche nicht gefunden
    main.h(29): error C2275: 'UINT': Ungültige Verwendung dieses Typs als Ausdruck
    Logfile.h(44): error C2146: Syntaxfehler: Fehlendes ',' vor Bezeichner 'Text'
    Logfile.h(41): error C2146: Syntaxfehler: Fehlendes ',' vor Bezeichner 'Text'
    test.cpp(12): error C2143: Syntaxfehler: Es fehlt ';' vor '}'
    test.cpp(11): error C2143: Syntaxfehler: Es fehlt ';' vor '}'
    test.cpp(6): error C2143: Syntaxfehler: Es fehlt ';' vor '}'
    test.h(12): error C2143: Syntaxfehler: Es fehlt ';' vor '}'
    main.h(43): error C2143: Syntaxfehler: Es fehlt ';' vor '}'
    Logfile.h(50): error C2143: Syntaxfehler: Es fehlt ';' vor '}'
    Logfile.h(29): error C2143: Syntaxfehler: Es fehlt ';' vor '}'
    Singleton.h(39): error C2143: Syntaxfehler: Es fehlt ';' vor '}'
    Singleton.h(38): error C2143: Syntaxfehler: Es fehlt ';' vor '}'
    Singleton.h(37): error C2143: Syntaxfehler: Es fehlt ';' vor '}'
    Singleton.h(29): error C2143: Syntaxfehler: Es fehlt ';' vor '}'
    Singleton.h(21): error C2143: Syntaxfehler: Es fehlt ';' vor '}'
    application.h(135): error C2143: Syntaxfehler: Es fehlt ';' vor '}'
    test.cpp(9): error C2143: Syntaxfehler: Es fehlt ';' vor '{'
    test.cpp(4): error C2143: Syntaxfehler: Es fehlt ';' vor '{'
    test.h(7): error C2143: Syntaxfehler: Es fehlt ';' vor '{'
    main.h(32): error C2143: Syntaxfehler: Es fehlt ';' vor '{'
    Logfile.h(32): error C2143: Syntaxfehler: Es fehlt ';' vor '{'
    Logfile.h(22): error C2143: Syntaxfehler: Es fehlt ';' vor '{'
    Singleton.h(34): error C2143: Syntaxfehler: Es fehlt ';' vor '{'
    Singleton.h(32): error C2143: Syntaxfehler: Es fehlt ';' vor '{'
    Singleton.h(24): error C2143: Syntaxfehler: Es fehlt ';' vor '{'
    Singleton.h(20): error C2143: Syntaxfehler: Es fehlt ';' vor '{'
    Singleton.h(12): error C2143: Syntaxfehler: Es fehlt ';' vor '{'
    Logfile.h(29): error C2143: Syntaxfehler: Es fehlt ',' vor '}'
    application.h(127): error C2143: Syntaxfehler: Es fehlt ',' vor ';'
    Logfile.h(41): error C2143: Syntaxfehler: Es fehlt ',' vor ')'
    Logfile.h(29): error C2065: 'YELLOW': nichtdeklarierter Bezeichner
    Logfile.h(41): error C2065: 'Text': nichtdeklarierter Bezeichner
    application.h(113): error C2065: 'Test': nichtdeklarierter Bezeichner
    Logfile.h(24): error C2065: 'RED': nichtdeklarierter Bezeichner
    Logfile.h(27): error C2065: 'PURPLE': nichtdeklarierter Bezeichner
    Logfile.h(25): error C2065: 'GREEN': nichtdeklarierter Bezeichner
    application.h(126): error C2065: 'f_NearPlane': nichtdeklarierter Bezeichner
    application.h(125): error C2065: 'f_FieldofView': nichtdeklarierter Bezeichner
    application.h(127): error C2065: 'f_FarPlane': nichtdeklarierter Bezeichner
    Logfile.h(26): error C2065: 'BLUE': nichtdeklarierter Bezeichner
    application.h(113): error C2059: Syntaxfehler: '>'
    Logfile.h(44): error C2059: Syntaxfehler: '...'
    Singleton.h(41): error C2039: 'm_pSingleton': Ist kein Element von 'operator``global namespace'''

    Wie gesagt, bis auf die Warnung ganz oben lässt sich das Programm fehlerfrei ausführen, außer wenn ich eben versuche eine Liste in einem h-File zu erzeugen.

    Die Test.h entspricht der light.h von meinem ersten Post.

    Die anderen Files kann ich zeigen wenn es gewünscht wird.

    Ich bin zugegeben wirklich am Ende meines Lateins, da es wirklich nur in diesem einen Fall Probleme gibt



  • Ne, das hast Du falsch verstanden.

    light.h:

    #include "main.h"

    ---

    main.h

    #include "light.h"

    Über dieses Konstrukt sollst Du Dir mal gedanken machen.

    [edit] liste durch light ersetzt



  • Hm

    Also ich dachte dies folgendermaßen:

    In der Main werden z.B. die Direct X Files inkludiert. Deshalb muss ich die main.h in der light. h inkludieren, sonst hab ich dort ja keinen Zugriff auf besagt Elemente (und ich möchte ja nicht in jeder Klasse unmengen gleicher Files inkludieren)

    umgekehrt kann ich nur dann " Light" Objekte erzeugen, wenn ich die light.h kenne.

    Irgendwie/wo hab ich mich verannt oder?



  • falcon schrieb:

    Irgendwie/wo hab ich mich verannt oder?

    Ja in einen Teufelskreis ... 🙂



  • ja, hast Du.

    An der Stelle, an der light.h die main.h includiert, ist von light rein garnichts bekannt. Deswegen wirft Dir der Compiler massig Fehlermeldungen um die Ohren das er Light nicht in main.h kennt.

    Hier hilft strikte Trennung von definition und deklaration sowie forward deklarationen und Zeiger weiter.

    (Hab mir Dienen Source nicht ins letzte Detail angesehen).

    Beispiel:

    a.h

    #include "b.h"
    
    class a
    {
    
    };
    

    b.h

    #include "b.h"
    
    class b
    {
       a class;
    };
    

    Der Precompiler baut daraus:

    class b
    {
       a class;
    };
    
    class a
    {
    
    };
    

    Bei der Deklaration von b ist a unbekannt.



  • Ja, allerdings, das hast du. Wenn ich mir die "main.h" ansehe, die du dort oben hast, braucht die selber deine "Light.h" überhaupt nicht. Erst das Hauptprogramm muß sich darum kümmern, deine Hilfsheader einzubinden.

    (und ansonsten ist es wohl günstiger, wenn du die DirectX-Header nur dort einbindest, wo sie wirklich benötigt werden - auch wenn's mehr Schreibarbeit bedeutet)



  • Hinzu zu fügen wäre:

    Daraus, das Du nur das includierst was Du wirklich benötigst (und oft lässt sich im Header mit fwd deklaration arbeiten), folgt:

    1. Weniger Fehlerquellen
    2. Weniger abhängigkeiten und dadurch kürzere Compilerzeiten wenn sich etwas ändert.



  • Ok

    So langsam (sehr langsam) wird mir klar, wo die Problematik liegt.

    Wird wohl noch einige Zeit dauern, bis ich das sinnvoll gelöst hab, aber ich weiß nun ja wo ich ansetzten muss.

    Vielen Dank an alle, vor Allem natürlich Knuddlbaer, für die Mühe.

    Gruß

    falcon


Anmelden zum Antworten