在写一个大的程序时,常常要定义很多类,每个类有各自的用途。一个类很可能会包含另一个类定义的成员变量。假如有一个类A,一个类B。类A有一个成员变量B* b。类B有一个成员变量A* a。这时我们在定义类A和类B时会分别在开头时包含引用到的.h文件。这样会导致编译出错。
具体例子如下:
Mutou.h文件代码如下:
#ifndef _Mutou_H_
#define _Mutou_H_
#include"MutouFSM.h"
#include"State.h"
#include"cocos2d.h"
USING_NS_CC;
class Mutou :public Node
{
public:
CREATE_FUNC(Mutou);
virtual bool init();
bool isTire();
bool isWantToWriteArticle();
void writeCode();
void writeArticle();
void rest();
MutouFSM* getFSM();
virtual void update(float dt);
private:
MutouFSM* mFSM;
};
#endif
MutouFSM.h文件代码如下:
#ifndef _MutouFSM_H_
#define _MutouFSM_H_
#include"Mutou.h"
#include"State.h"
#include"cocos2d.h"
USING_NS_CC;
class MutouFSM :public Node
{
public:
static MutouFSM* createWithMutou(Mutou* mutou);
bool initWithMutou(Mutou*mutou);
virtual void update(float dt);
void changeState(State*state);
private:
State* mCurState;
Mutou*mMutou;
};
#endif
类Mutou需要调用类MutouFSM,类MutouFSM需要调用类Mutou,我们理所当然会想到包含.h头文件。这样编译会出错:
错误 3 error C2143: 语法错误 : 缺少“;”(在“*”的前面) (..\Classes\MutouFSM.cpp) f:\ccs\fsm\classes\mutou.h 25 1 FSM
错误 6 error C2143: 语法错误 : 缺少“;”(在“*”的前面) (..\Classes\MutouFSM.cpp) f:\ccs\fsm\classes\mutou.h 28 1 FSM
出现上述的错误并不是由于我们编程时头脑发昏少加了“;”,而是两个.h文件互相调用,导致无线循环调用。
解决的办法是,在报错的那个.h文件的类定义前加上class声明调用的类(即class 类)。解决上面的错误是在Mutou.h的文件中,在class Mutou定义前声明class MutouFSM。