Ошибка компилятора по неизвестным причинам (C ++) - PullRequest
0 голосов
/ 07 мая 2011

Я получаю ошибку компилятора (C2061) в MSVS C ++ 2010 IDE, когда пытаюсь скомпилировать. Я просто понятия не имел, почему это происходит, поскольку я не вижу никакой ошибки устройства.

#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

и "class CGame" объявлен и определен в "CGame.h", поэтому я действительно не могу понять, почему ....

Ответы [ 2 ]

2 голосов
/ 07 мая 2011

Ваши заголовки пытаются включить друг друга - вы не можете этого сделать. Удалите #include заголовка игры из заголовка компонента и используйте вместо него предварительное объявление CGame.

 CComponent(class CGame &game);

На этапе проектирования подобные проблемы обычно означают, что у вас что-то не так. Я думаю, что маловероятно, что компоненты должны знать об игре, частью которой они являются.

1 голос
/ 07 мая 2011

Похоже, CGame.h компилируется первым. Итак, представьте шаги

  1. CGame.h начинает компилироваться
  2. CComponent.h включается
  3. CComponent.h начинает компилирование из-за включения
  4. CGame.h включен, но пропущен из-за #pragma один раз (уже запущен в шаге 1)
  5. Ошибка: CGame - неопределенный символ

Решение: Избавьтесь от включений, замените предварительными декларациями. Вы перенаправляете объявление CComponent в CGame.h, делаете обратное в CComponent.h (форвард объявляет CGame)

...