Klasse in anderen Headerdateien unbekannt



  • Ich habe eine Klasse Cube3D geschrieben, die Würfel zeichnen können soll. Problem: Die Klasse ist in allen anderen Header-Files unbekannt auch wenn der Header inkludiert wurde. In allen Sourcefiles kann ich dagegen die Klasse problemlos nutzen und Objekte anlegen.

    Klassendefinition:

    #ifndef __CUBE3D_H__
    #define __CUBE3D_H__
    
    #include <d3dx9.h>
    #include <d3d9.h>
    #include "globals.h"
    
    class Cube3D	{
    
    public:
    	Cube3D();
    	Cube3D(float x, float y, float z, float width, float height, float depth);
    	~Cube3D();
    	void setSize(float width, float height, float depth);
    	void setPosition(float x, float y, float z);
    	void render();
    
    private:
    
    	void updateVertices();
    	bool createVertexBuffer();
    
    	float fX,fY,fZ;
    	float fWidth, fHeight, fDepth;
    	LPDIRECT3DVERTEXBUFFER9 pCubeVertexBuffer;
    
    };
    
    #endif // __CUBE3D_H__
    

    geplante Verwendung (nur als Test):

    #ifndef __D3DMAIN_H__
    #define __D3DMAIN_H__
    
    #include <d3dx9.h>
    #include <d3d9.h>
    #include "cube3d.h"
    
    #define ERR_CREATE_D3DOBJ		-1000;
    #define ERR_CREATE_D3DDEVICE	-1001;
    
    #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)
    
    struct CUSTOMVERTEX	{
    	FLOAT x, y, z;
          DWORD colour;
    };
    
    class D3DMain	{
    
    public:
    	int create3DDevice();
    	int cleanUpD3D();
    
    	int drawFrame();
    
    private:
    	LPDIRECT3DSURFACE9 surf;
    	CUSTOMVERTEX vertices[3];
    	LPDIRECT3DVERTEXBUFFER9 pD3DVertexBuffer;
    
    	Cube3D c1;  // Hier entsteht der Fehler
    
    	void setupMatrices();
    };
    
    #endif	// __D3DMAIN_H__
    

    Dazu fällt VisualC++ dann nur ein:

    D:\doc\src\c\directx\dx_versuch1\d3dmain.h(33) : error C2146: syntax error : missing ';' before identifier 'c1'
    D:\doc\src\c\directx\dx_versuch1\d3dmain.h(33) : error C2501: 'Cube3D' : missing storage-class or type specifiers
    D:\doc\src\c\directx\dx_versuch1\d3dmain.h(33) : error C2501: 'c1' : missing storage-class or type specifiers
    

    Ich arbeite noch nicht sehr lange damit, aber aus der fehlermeldung schliesse ich, dass ihm die Klasse einfach nicht bekannt ist oder ?

    Wenn ich versuche die Klasse vorerst zu deklarieren mit

    Class Cube3D;
    

    behauptet er, er würde eine nicht weiter definierte Klasse Cube3D verwenden wollen.



  • Obskure: Sollte eingentlich den Default-Construstor nehmen. Ein ganz boeser Verdacht, steht im vorhergehenden File etwas, was das Einbinden des Headers veraender koennte (nicht geschlossene Klammer z. B.)?



  • Wenn du mit vorherigem File das #include "globals.h" meinst: Ich denke das File ist okay, Klammern gibts da ohnehin nicht drin, sondern nur Variablendeklarationen.

    Edit:

    Also, jetzt habe ich doch gerade mal ein wenig damit rumgespielt und das #include "globals.h" aus der cube3d.h in die cube3d.cpp gesteckt und jetzt gehts. Jetzt wüsste ich nur noch gerne warum?! 😮



  • Bei dem Define: Das Semikolon ist zuviel - oder ist das so gewollt?



  • okay, ja die sind zuviel, bzw. unnötig, allerdings ändert es auch nix, wenn ich die weglasse.



  • Wie sieht denn die globals.h aus ?



  • Der Code sollte soweit in Ordnung sein.

    muhzilla schrieb:

    okay, ja die sind zuviel, bzw. unnötig, allerdings ändert es auch nix, wenn ich die weglasse.

    Das mit den Semikolons war auch nur deswegen, wenn du die defines in einem if, ... verwenden willst, dann würden die zu einem Fehler führen



  • muhzilla schrieb:

    Also, jetzt habe ich doch gerade mal ein wenig damit rumgespielt und das #include "globals.h" aus der cube3d.h in die cube3d.cpp gesteckt und jetzt gehts. Jetzt wüsste ich nur noch gerne warum?! 😮

    Leider ist meine Kristallkugel gerade in Reparatur, aber wenn man den File sehen wuerde, koennte man das vielleicht sagen.



  • #ifndef GLOBALS_H
    #define GLOBALS_H
    
    #include <windows.h>
    #include <d3dx9.h>
    #include <d3d9.h>
    #include "d3dmain.h"
    
    extern HWND g_hMainWnd;						// MainWindow WindowHandle;
    extern HINSTANCE  g_hMainInst;				// Main Instance of Application;
    extern WNDCLASSEX g_wndClassEx;				// WindowClass used for MainWindow
    extern char g_szAppName[16];				// Application Title
    extern D3DMain d3dmain;
    
    // DirectGraphics Globals //
    
    extern IDirect3D9 *g_pD3D;
    extern IDirect3DDevice9 *g_pd3dDevice;
    
    #endif // GLOBALS_H
    


  • Ich verstehe da etwas nicht: Die "d3dmain.h" ist in "global.h" eingebunden, aber umgekehrt ist die "global.h" in "d3dmain.h" eingebunden. Kann es sein, dass die Hierachie der Header etwas durch einander geraten ist?



  • muhzilla schrieb:

    #ifndef __D3DMAIN_H__
    #define __D3DMAIN_H__
    
    #include <d3dx9.h>
    #include <d3d9.h>
    #include "cube3d.h"
    
    #define ERR_CREATE_D3DOBJ		-1000;
    #define ERR_CREATE_D3DDEVICE	-1001;
    
    #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)
    
    struct CUSTOMVERTEX	{
    	FLOAT x, y, z;
          DWORD colour;
    };
    
    class D3DMain	{
    
    public:
    	int create3DDevice();
    	int cleanUpD3D();
    
    	int drawFrame();
    
    private:
    	LPDIRECT3DSURFACE9 surf;
    	CUSTOMVERTEX vertices[3];
    	LPDIRECT3DVERTEXBUFFER9 pD3DVertexBuffer;
    
    	Cube3D c1;  // Hier entsteht der Fehler
    
    	void setupMatrices();
    };
    
    #endif	// __D3DMAIN_H__
    

    die beste art solche fehler auszuschließen is die verwendung von zeigern/referenzen und vorwärtsdeklarationen

    d.h. der header von cube3d wird garnich erst eingebunden

    #ifndef __D3DMAIN_H__
    #define __D3DMAIN_H__
    
    #include <d3dx9.h>
    #include <d3d9.h>
    
    class Cube3D; // vorwärtsdeklaration
    
    #define ERR_CREATE_D3DOBJ		-1000;
    #define ERR_CREATE_D3DDEVICE	-1001;
    
    #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)
    
    struct CUSTOMVERTEX	{
    	FLOAT x, y, z;
          DWORD colour;
    };
    
    class D3DMain	{
    
    public:
    	int create3DDevice();
    	int cleanUpD3D();
    
    	int drawFrame();
    
    private:
    	LPDIRECT3DSURFACE9 surf;
    	CUSTOMVERTEX vertices[3];
    	LPDIRECT3DVERTEXBUFFER9 pD3DVertexBuffer;
    
    	Cube3D* c1;  // Hier entsteht der Fehler
    
    	void setupMatrices();
    };
    
    #endif	// __D3DMAIN_H__
    

    statt den header von cube3d im d3dmain header einzubinden bindest du ihn nur in der cpp ein in der auf den zeiger cl zugegriffen wird



  • MBCS-CITP schrieb:

    Ich verstehe da etwas nicht: Die "d3dmain.h" ist in "global.h" eingebunden, aber umgekehrt ist die "global.h" in "d3dmain.h" eingebunden. Kann es sein, dass die Hierachie der Header etwas durch einander geraten ist?

    Das 2 Header sich gegenseitig einbinden ist doch nichts ungewöhnliches, oder? Klasse A kann Klasse B verwenden und Klasse B kann Klasse A verwenden.


Anmelden zum Antworten