2012-03-31 7 views
0

Ich habe eine Header-Datei mit dem Namen Application.h, wo ich eine Überschrift namens CollisionHandler.h enthalten. CollisionHandler enthält Application.h, daher erhalte ich beim Kompilieren einen zu vielen Includes-Fehler. Um dies zu lösen ich die CollisionHandler umfassen zwischen Kopfschutz gesetzt haben, wie folgt aus:Fehler kann nicht mit Datei einschließlich Header behoben werden, die sich selbst mit Header-Wachen enthält

#ifndef COLLISION_HANDLER_INCLUDED_H 
#define COLLISION_HANDLER_INCLUDED_H 
#include "CollisionHandler.h" 
#endif 

aber wenn ich versuche, ein Objekt vom Typ CollisionHandler zu verwenden (diese Klasse definiert in CollisionHandler.h, zwischen Kopfschutz) als eine Membervariable der Application-Klasse (die auch zwischen Kopfschutz in Application.h definiert ist), habe ich diesen Fehler für jede Datei wiederholt erhalten, die Application.h (5-mal oder so) enthält:

1>c:\users\aitor\documents\visual studio 2008\projects\copter\copter\application.h(19) : error C2143: syntax error : missing ';' before '*' 
1>c:\users\aitor\documents\visual studio 2008\projects\copter\copter\application.h(19) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>c:\users\aitor\documents\visual studio 2008\projects\copter\copter\application.h(19) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 

die Linie 19 ist die Zeile, in der ich das CollisionHandler-Objekt als eine Membervariable deklariere. Hier

ist, den Code in Application.h (mit den entsprechenden Linien eingerückt):

#include "Header.h" 
#include <stdio.h> 
#include "GameCharter.h" 
#include <vector> 
#include <boost/shared_ptr.hpp> 
    #ifndef COLLISION_HANDLER_INCLUDED_H //Here I include 
    #define COLLISION_HANDLER_INCLUDED_H //the collision 
    #include "CollisionHandler.h"  //handler header 
    #endif 
using namespace std; 
#ifndef APPLICATION_DEFINED_H 
#define APPLICATION_DEFINED_H 
class LimitsManager; 
class ObstacleManager; 
class Application 
{ 
public: 
     CollisionHandler *handler; //Here I declare the CollisionHandler 
    ObstacleManager *obstacleManager; 
    LimitsManager *limitsManager; 
    vector<boost::shared_ptr<GameChar> > characters; 
    vector<int> idsToRemove; 
    void gameLoop(); 
    Application(); 
    bool idsNeedUpdate; 
    bool objectsNeedToRemove; 
}; 
#endif 

Und das ist der Code für CollisionHandler.h:

#include "Header.h" 
#include "Application.h" 
#include "GameCharter.h" 
#include "LimitObstacle.h" 
#ifndef COLLISION_HANDLER_H 
#define COLLISION_HANDLER_H 
class CollisionHandler 
{ 
    Application *app; 
public: 
    void handleCollisions(); 
    CollisionHandler() 
    { 

    } 
    CollisionHandler(Application *app); 
    bool collidersAreCollidingGeneral(GameChar* char1,GameChar* char2); 
    bool collidersAreCollidingSecondary(GameChar* char1,GameChar* char2); 
}; 
#endif 

Auch, wenn ich class CollisionHandler; verwenden in Application.h und dann CollisionHandler.h in der cpp-Datei, es funktioniert

+2

Bitte zeigen Sie uns den Code, den Sie reden. –

+2

Zwei Header einschließlich einander klingt nicht wie eine gute Idee. –

+0

@ PéterTörök Fertig – XaitormanX

Antwort

2

Einschließlich Header zyklisch ist falsch, auch mit Wächter.

Versuchen Sie, die Abhängigkeit zu entfernen, indem Sie, soweit möglich, Vorwärtsdeklarationen verwenden.

Wenn Sie keine Vorwärtsdeklarationen verwenden können, ist Ihr Design fehlerhaft.

+0

Ok, danke. Ich benutzte Vorwärtsdeklarationen, um es zu lösen, aber ich wollte wissen, warum das nicht funktioniert – XaitormanX

1

alles, was Sie tun müssen, ist hinzuzufügen/schreiben

pragma once 

am Anfang jeder Header-Datei

Verwandte Themen