当我尝试编译时,我在MSVS C ++ 2010 IDE中遇到编译器错误(C2061)。我根本不知道为什么会发生这种情况,因为我看不出任何明显的错误。
#pragma once
#ifndef _CCOMPONENT_H
#define _CCOMPONENT_H
#include "CGame.h"
class CComponent
{
public:
CComponent(CGame &game);
~CComponent();
protected:
virtual void Draw();
virtual void Update();
virtual void Init();
void Dispose();
};
#endif // _CCOMPONENT_H
编译错误:
ccomponent.h(10): error C2061: syntax error : identifier 'CGame'
CGame.h的内容
/**************************************************
*
*
****************************************************/
#pragma once
#ifndef _CGAME_H
#define _CGAME_H
#include <cstdio>
#include <list>
//#include <Box2D/Box2D.h>
#include <allegro5\allegro5.h>
#include "SharedDef.h"
#include "CComponent.h"
#include "CTestPlayer.h"
using namespace std;
class CComponent;
class CTestPlayer;
const int MAX_COMPONENTS = 255;
class CGame
{
public:
// CONSTRUCTORS
CGame();
~CGame();
// ACCESSORS
ALLEGRO_DISPLAY *GetGameDisplay();
ALLEGRO_EVENT_QUEUE *GetGameEventQueue();
list<CComponent> GetComponents() { return *m_Components; }
void AddComponent(CComponent component);
bool IsRun();
void StartTimer();
void StopTimer();
virtual bool ShouldDraw();
virtual bool ShouldUpdate();
virtual void Update(void);
virtual void Draw(void);
virtual void Dispose();
protected:
virtual void RegisterEventSources();
virtual void Initialize();
private:
bool InitializeAllegro();
private:
ALLEGRO_DISPLAY *m_Display;
ALLEGRO_EVENT_QUEUE *m_EventQueue;
ALLEGRO_TIMER *m_Timer;
ALLEGRO_EVENT m_Event;
list<CComponent> *m_Components;
//CComponent *m_Components[MAX_COMPONENTS];
bool m_bIsRunning;
bool m_bShouldDraw;
};
#endif // _CGAME_H
和“CGame.h”在“CGame.h”中声明和定义,所以我真的不明白为什么......
答案 0 :(得分:2)
你的标题试图#include彼此 - 你不能这样做。从组件标题中删除游戏标题的#include,然后使用CGame的前向声明。
CComponent(class CGame &game);
在设计方面,像这样的问题通常意味着你有错误。我认为组件不太可能知道他们所属的游戏。
答案 1 :(得分:1)
看起来首先编译CGame.h。想象一下步骤
解决方案:摆脱包含,替换前向声明。你在CGame.h中转发声明CComponent,在CComponent.h中执行相反的操作(转发声明CGame)