编译器错误原因不明(C ++)

时间:2011-05-07 10:56:46

标签: c++ compiler-construction compiler-errors visual-studio

当我尝试编译时,我在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”中声明和定义,所以我真的不明白为什么......

2 个答案:

答案 0 :(得分:2)

你的标题试图#include彼此 - 你不能这样做。从组件标题中删除游戏标题的#include,然后使用CGame的前向声明。

 CComponent(class CGame &game);

在设计方面,像这样的问题通常意味着你有错误。我认为组件不太可能知道他们所属的游戏。

答案 1 :(得分:1)

看起来首先编译CGame.h。想象一下步骤

  1. CGame.h开始编译
  2. 包含CComponent.h
  3. CComponent.h因包含
  4. 而开始编译
  5. 包含CGame.h,但由于#pragma一次(已在步骤1中启动)而被跳过
  6. 错误:CGame是未定义的符号
  7. 解决方案:摆脱包含,替换前向声明。你在CGame.h中转发声明CComponent,在CComponent.h中执行相反的操作(转发声明CGame)