Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

02.05.2010, 19:36

Include Guard Problem

Hallo,

bin jetzt seit ner guten halbe Stunde genervt mit dem dämlichen Problem der "Headerfileabhängigkeit" und hab nun keine Ahnung mehr,was ich machen soll.

Es geht um folgendes:
ich habe ein headerfile X, das die header a,b,c inkludiert. ebenso inkludiert jeder header a,b,c den header X. in a,b,c sind klassen definiert, die in der klasse vom header X verwendet werden. nun krig ich die tolle fehlermeldung, dass klasse c_a, c_b, c_c nicht deklariert ist, obwohl sie es ist.

habe sowohl diese externen include guards als auch die normalen verwendet und es hilft einfach nichts. was kann man denn noch machen, um das zu beheben?


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#ifndef CGRAPHICDEVICE_H
#define CGRAPHICDEVICE_H

#include <vector>
#include <algorithm>
#include <d3d9.h>
#include <d3dx9.h>
#pragma comment( lib, "d3d9.lib" )
#pragma comment( lib, "d3dx9.lib" )
#ifndef SCOLOR_H
#include "SColor.h"
#endif
#ifndef CTEXTURE_H
#include "CTexture.h"
#endif
#ifndef CSPRITE_H
#include "CSprite.h"
#endif



class CGraphicDevice
{
private:
    LPDIRECT3D9             _d3d;
    LPDIRECT3DDEVICE9       _d3ddevice;
    std::vector<CSprite*>   _sprites;
    std::vector<CTexture*>  _textures;
    //std::vector<CSprite*> _renderSprites;     // sprites to be rendered in the frame

public:
    CGraphicDevice( HWND Window, int WindowWidth, int WindowHeight, bool Fullscreen );
    ~CGraphicDevice();
    const CTexture* GetTexture( const char* Filename );
    void RemoveTexture( const CTexture* Texture );
    //const CSprite* AddSprite( const CTexture* Texture );
    //void RemoveSprite( const CSprite* Sprite );
    void Render();
};

#endif


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#ifndef CTEXTURE_H
#define CTEXTURE_H

#ifndef CGRAPHICDEVICE_H
#include "CGraphicDevice.h"
#endif



class CTexture
{
private:
    const char*         _filepath;
    IDirect3DTexture9*  _texture;
    D3DSURFACE_DESC     _surface;

public:
    CTexture( const char* FilePath, IDirect3DTexture9* Texture ) :
              _filepath( FilePath ), _texture( Texture )
    {
        _texture->GetLevelDesc( 0, &_surface );
    }   // end Konstructor
    ~CTexture()
    {
        _texture->Release();
    }
    const char* GetFilePath() const { return _filepath; }
    const IDirect3DTexture9* GetD3DTexture() const{ return _texture; }
    const int GetWidth() const{ return _surface.Width; }
    const int GetHeight() const{ return _surface.Height; }
    inline bool operator==( const CTexture& param ){ return _filepath == param.GetFilePath(); }
};

#endif


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#ifndef CSPRITE_H
#define CSPRITE_H

#ifndef CGRAPHICDEVICE_H
#include "CGraphicDevice.h"
#endif



class CSprite
{
private:
    const CTexture*         _texture;
    ID3DXSprite*            _sprite;
    int                     _layer;

public:
    CSprite( ID3DXSprite* Sprite, const CTexture* Texture ) : _sprite( Sprite ), _texture( Texture ){}
    ~CSprite()
    {
        _sprite->Release();
    }
    void Render();
    /*inline bool IsVisible();
    inline float GetScaleX();
    inline float GetScaleY();
    inline float GetPositionX();
    inline float GetPositionY();
    inline float GetWidth();
    inline float GetHeight();
    inline int GetColorRed();
    inline int GetColorGreen();
    inline int GetColorBlue();
    inline int GetColorAlpha();
    inline int GetLayer();
    void SetPosition( float X, float Y );
    void SetScale( float ScaleX, float ScaleY );
    void SetColor( int Red, int Green, int Blue, int Alpha = 255 );
    void SetLayer( int Layer );*/
};

#endif



als fehlermeldung:

Zitat


1>c:\spieleprogrammierung\projekte\h3 blob engine\h3 blob engine\cgraphicdevice.h(27) : error C2065: 'CSprite': nichtdeklarierter Bezeichner
1>c:\spieleprogrammierung\projekte\h3 blob engine\h3 blob engine\cgraphicdevice.h(27) : error C2059: Syntaxfehler: '>'
1>c:\spieleprogrammierung\projekte\h3 blob engine\h3 blob engine\cgraphicdevice.h(39) : error C2143: Syntaxfehler: Es fehlt ';' vor '}'
1>c:\spieleprogrammierung\projekte\h3 blob engine\h3 blob engine\csprite.h(11) : error C2143: Syntaxfehler: Es fehlt ';' vor '{'
1>c:\spieleprogrammierung\projekte\h3 blob engine\h3 blob engine\csprite.h(18) : error C2065: 'Texture': nichtdeklarierter Bezeichner
1>c:\spieleprogrammierung\projekte\h3 blob engine\h3 blob engine\csprite.h(18) : error C3861: "_texture": Bezeichner wurde nicht gefunden.
1>c:\spieleprogrammierung\projekte\h3 blob engine\h3 blob engine\csprite.h(18) : error C2143: Syntaxfehler: Es fehlt ',' vor '{'
1>c:\spieleprogrammierung\projekte\h3 blob engine\h3 blob engine\csprite.h(18) : error C2143: Syntaxfehler: Es fehlt ';' vor '{'
1>c:\spieleprogrammierung\projekte\h3 blob engine\h3 blob engine\csprite.h(20) : error C2143: Syntaxfehler: Es fehlt ';' vor '{'
1>c:\spieleprogrammierung\projekte\h3 blob engine\h3 blob engine\csprite.h(22) : error C2143: Syntaxfehler: Es fehlt ';' vor '}'
1>c:\spieleprogrammierung\projekte\h3 blob engine\h3 blob engine\csprite.h(40) : error C2143: Syntaxfehler: Es fehlt ';' vor '}'
1>c:\spieleprogrammierung\projekte\h3 blob engine\h3 blob engine\csprite.cpp(5) : error C2653: 'CSprite': Keine Klasse oder Namespace
1>c:\spieleprogrammierung\projekte\h3 blob engine\h3 blob engine\csprite.cpp(6) : error C2143: Syntaxfehler: Es fehlt ';' vor '{'
1>c:\spieleprogrammierung\projekte\h3 blob engine\h3 blob engine\csprite.cpp(14) : error C2143: Syntaxfehler: Es fehlt ',' vor ')'
1>c:\spieleprogrammierung\projekte\h3 blob engine\h3 blob engine\csprite.cpp(16) : error C2065: 'src': nichtdeklarierter Bezeichner
1>c:\spieleprogrammierung\projekte\h3 blob engine\h3 blob engine\csprite.cpp(16) : error C2065: 'color': nichtdeklarierter Bezeichner
1>c:\spieleprogrammierung\projekte\h3 blob engine\h3 blob engine\csprite.cpp(16) : error C2143: Syntaxfehler: Es fehlt ',' vor ')'
1>c:\spieleprogrammierung\projekte\h3 blob engine\h3 blob engine\csprite.cpp(17) : error C2143: Syntaxfehler: Es fehlt ';' vor '}'
1>c:\spieleprogrammierung\projekte\h3 blob engine\h3 blob engine\csprite.cpp(18) : error C2143: Syntaxfehler: Es fehlt ';' vor '}'
1>c:\spieleprogrammierung\projekte\h3 blob engine\h3 blob engine\csprite.cpp(18) : fatal error C1004: Unerwartetes Dateiende gefunden.
1>Code wird generiert...
1>Kompilieren...
1>CGraphicDevice.cpp
1>Code wird generiert...
1>Kompilieren...
1>WinMain.cpp
1>IDevice.cpp
1>Code wird generiert...
1>Das Buildprotokoll wurde unter "file://c:\Spieleprogrammierung\Projekte\H3 Blob Engine\H3 Blob Engine\Debug\BuildLog.htm" gespeichert.
1>H3 Blob Engine - 20 Fehler, 0 Warnung(en)
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========



krigs nicht hin, dass er es mir kompiliert :/

Beiträge: 774

Beruf: Student

  • Private Nachricht senden

2

02.05.2010, 19:51

C-/C++-Quelltext

1
2
3
#ifndef CGRAPHICDEVICE_H
#include "CGraphicDevice.h"
#endif

Diese #ifdef/#endif da brauchts nicht nochmal. Darum kümmert sich ja der Includeguard in dem eigentlichen Header.
Du scheinst ja Visual Studio/C++ 20xx zu verwenden? Da kannst du statt Includeguards einfach "#pragma once" am Anfang eines Headers schreiben. Das ist laut Dokumentation dann sogar noch schneller als Includeguards.

CBenni::O

1x Contest-Sieger

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

3

02.05.2010, 20:04

Zu deinem Problem: schau mal nach Forward-Deklarationen ;)

Die sind so wie Funktionsprototypen, nur eben für Klassen ;)

mfg CBenni::O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

Tobiking

1x Rätselkönig

  • Private Nachricht senden

4

02.05.2010, 20:04

Zyklisches Includieren ist nicht möglich. Beide Klassen wollen das die jeweils andere vorher deklariert wurde. Eine der beiden Klassen muss aber zuerst deklariert werden, und diejenige die zuerst deklariert wird, kennt dann natürlich die andere nicht.

Wenn du CGraphicDevice nicht brauchst, dann includier nicht den Header davon. Wenn du nur einen Pointer auf CGraphicDevice benötigst, dann reicht eine forward Declaration.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

Werbeanzeige