我有一个名为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类的成员变量(也在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中的代码(用相应的行标注):
#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
另外,如果我在Application.h中使用class CollisionHandler;
然后在cpp文件中包含CollisionHandler.h,那么它可以正常工作
答案 0 :(得分:2)
周期性地包括标题是错误的,即使是包含警戒。
尽可能使用前向声明来删除依赖项。
如果你不能使用前瞻性声明,那么你的设计是有缺陷的。
答案 1 :(得分:1)
您需要做的就是添加/写入
pragma once
位于每个头文件的顶部