我有一个像这样的头文件:
#pragma once
#include "gamestate.h"
#include "ExitListener.h"
class InitialGameState : public GameState
{
public:
InitialGameState(Ogre::Camera *cam, Ogre::SceneManager *sceneMgr, OIS::Keyboard *keyboard, OIS::Mouse *mouse, Ogre::Root *root);
~InitialGameState(void);
virtual bool update(Ogre::Real time);
virtual void pause(void);
virtual void start(void);
void keyPressed(const OIS::KeyEvent &e);
void keyReleased(const OIS::KeyEvent &e);
//private:
ExitListener *mFrameListener;
};
Run Code Online (Sandbox Code Playgroud)
这个问题是我从VC 8得到以下错误:
InitialGameState.h(16) : error C2143: syntax error : missing ';' before '*'
InitialGameState.h(16) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
InitialGameState.h(16) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
Run Code Online (Sandbox Code Playgroud)
(他们都是指最后一行)
我有一个课程ExitListener.h,这就是为什么我没有得到错误
编辑:ExitListener.h:
#pragma once
#include <Ogre.h>
#include <OIS/OIS.h>
#include <CEGUI/CEGUI.h>
#include <OgreCEGUIRenderer.h>
#include "Thing.h"
#include "InitialGameState.h"
using namespace Ogre;
class ExitListener : public FrameListener, public OIS::KeyListener, public OIS::MouseListener
{
public:
ExitListener(OIS::Keyboard *keyboard, OIS::Mouse *mouse, Camera *cam, std::vector<Thing*> &vec):
mKeyboard(keyboard), r(0.09), mContinue(true), mRunningAnimation(false),
mMouse(mouse), mYaw(0), mPitch(0), things(vec), mCamera(cam), mWDown(false), mSDown(false), mADown(false),
mDDown(false)
{
things = vec;
mKeyboard->setEventCallback(this);
mMouse->setEventCallback(this);
}
bool frameStarted(const FrameEvent& evt);
bool keyPressed(const OIS::KeyEvent &e);
bool keyReleased(const OIS::KeyEvent &e);
bool mouseMoved(const OIS::MouseEvent &e);
bool mousePressed(const OIS::MouseEvent &e, OIS::MouseButtonID id);
bool mouseReleased(const OIS::MouseEvent &e, OIS::MouseButtonID id);
void setOwner(GameState *g);
private:
AnimationState *mSwim;
Radian r;
Radian mYaw;
Radian mPitch;
OIS::Keyboard *mKeyboard;
OIS::Mouse *mMouse;
Camera *mCamera;
bool mContinue;
bool mRunningAnimation;
std::vector<Thing*> &things;
bool mWDown;
bool mADown;
bool mDDown;
bool mSDown;
GameState *mOwner;
};
Run Code Online (Sandbox Code Playgroud)
编辑2:
事实证明,问题可以通过前向声明解决,然后直接在我的.cpp文件中包含其他标头.
谢谢.
Nav*_*een 23
我的猜测是ExitListener.h直接或间接包含InitialGameState.h头文件.所以头文件和编译器之间存在循环依赖关系,无法找到ExitListener的声明.如果您只需要在此类中存储ExitListener的指针,则无需包含ExitListener.h头文件.相反,您可以使用前向声明作为class ExitListener;
编辑:您可以使用上面建议的前向声明,或从ExitListener.h中删除InitialGameState.h包含.您只需要包含GameState.h(基类头文件).但我更喜欢在头文件中使用前向声明,并且只在cpp中包含头文件.
ExitListener在该标头内部定义了一个类(或至少声明了),但也可以是其他类,没有类或许多类.;结尾处的缺失ExitListener是一个非常好的猜测,这符合我对这些错误的体验.至少我确定错误意味着编译器不知道是什么ExitListener.ExitListener类)你根本不需要包含头.一个简单的前向声明class ExitListener;足以声明ExitListener *mFrameListener成员.(但是,您需要包含完整的类定义才能实现InitialGameState处理的成员函数ExitListener.如果在InitialGameState定义的头文件中实现这些函数,则需要保留"ExitListener.h"包含.)