2012-03-31 76 views
0

我有一个名为Application.h在那里我有一个名为CollisionHandler.h头一个头文件的文件包括头。 CollisionHandler包含Application.h,所以在编译时会出现太多的包含错误。为了解决这个问题我已经把CollisionHandler包括头警卫之间,就像这样:解决不了误差,包括本身使用头卫士

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

,但是当我尝试使用类型CollisionHandler的对象(这个类中定义CollisionHandler.h,头警卫之间)作为应用程序类的成员变量(其在Application.h头警卫之间还定义),我得到这个错误重复为每个包括Application.h文件(5次左右):

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 

线19是我将CollisionHandler对象声明为成员变量的行。

这里是Application.h代码(随着idented相关线):

#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 

这是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 

另外,如果我用class CollisionHandler;在Application.h然后包括CollisionHandler.h在cpp文件,它的工作原理

+2

请告诉我们你所谈论的代码。 – 2012-03-31 11:34:27

+2

两个包含对方的标题听起来不是一个好主意。 – 2012-03-31 11:35:15

+0

@PéterTörök完成 – XaitormanX 2012-03-31 11:44:37

回答

2

包括标题循环是错误的,甚至包括警卫。

尝试通过尽可能按照前置声明删除的依赖。

如果您不能使用前向声明,你的设计是有缺陷的。

+0

好的,谢谢。我使用前向声明来解决它,但我想知道为什么这不起作用 – XaitormanX 2012-03-31 11:48:14

1

所有你需要做的就是添加/写

pragma once 

在每个头文件的顶部