c++ ошибка C2065: необъявленный идентификатор

Возможный дубликат:
необъявленный идентификатор C++ (но заявлено?)

Я получаю сообщение об ошибке sprite.h(20): error C2065: 'Component' : undeclared identifier при попытке скомпилировать (у меня также есть пара других файлов). Ниже находится файл sprite.h. Я не могу в жизни понять, что вызывает эту проблему.

#ifndef SPRITE_H
#define SPRITE_H

#include "Image.h"
#include "Rectangle.h"
#include <string>
#include <SDL.h>
#include <vector>
#include "Component.h"

namespace GE2D {

    class Sprite {
    public:
        Sprite();
        Sprite(Image *i);
        Sprite(Image *i, int x, int y);
        Sprite(char *file, bool transparentBg, int x, int y, int w, int h);
        virtual ~Sprite();
        virtual void tick(SDL_Surface *screen, std::vector<Sprite*>* sprites, std::vector<Component*>* components);
        virtual void handleEvent(SDL_Event eve);
        virtual void draw(SDL_Surface *screen);
        void setPosition(int x, int y);
        const Rectangle& getRect() const;
        const Image& getImage() const;
        const Sprite& operator=(const Sprite& other);
        Sprite(const Sprite& other);
    protected:

    private:
        Image image;
        Rectangle rect;
    };

}
#endif

В файле .cpp tick() определяется так:

void Sprite::tick(SDL_Surface *screen, std::vector<Sprite*>* sprites, std::vector<Component*>* components) {}

Предполагается, что tick() принимает два вектора, как сейчас, но, может быть, есть лучший способ сделать это, который мог бы решить эту проблему?

EDIT В соответствии с просьбой, вот также Component.h:

#ifndef COMPONENT_H
#define COMPONENT_H

#include "Rectangle.h"
#include "Component.h"
#include "Sprite.h"
#include <vector>
#include <SDL.h>

namespace GE2D {

    class Component {
    public:
        Component();
        virtual ~Component();
        virtual void draw(SDL_Surface *screen) = 0;
        virtual void tick(SDL_Surface *screen, std::vector<Sprite*>* sprites, std::vector<Component*>* components) = 0;
        virtual void handleEvent(SDL_Event eve) = 0;
        const Rectangle& getRect() const;

    protected:
        Component(int x, int y, int w, int h);
    private:
        Rectangle rect;
    };

}
#endif

person Topsic    schedule 28.12.2012    source источник
comment
Показать содержимое Component.h   -  person Alok Save    schedule 28.12.2012
comment
Вы уверены, что Component.h определяет тип с именем Component?   -  person Armen Tsirunyan    schedule 28.12.2012
comment
@BoPersson, да вроде одинаковые, что делать?   -  person Topsic    schedule 28.12.2012
comment
@Ceilingbat - вам ничего не нужно делать, мы просто связываем их вместе, чтобы их было легче найти следующему человеку с той же проблемой.   -  person Bo Persson    schedule 28.12.2012


Ответы (1)


Sprite.h включает Component.h, который включает Sprite.h, создавая циклическую зависимость, которую невозможно разрешить.

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

class Component;
person Mike Seymour    schedule 28.12.2012
comment
Но разве включение охранников не должно решить эту проблему? Разве это не их цель? Редактировать: О, нвм, я видел твой ответ - person Topsic; 28.12.2012
comment
@Ceilingbat: Нет, они предотвращают только многократное включение. Невозможно одновременно определить Sprite перед Component и Component перед Sprite. - person Mike Seymour; 28.12.2012
comment
Где должна быть декларация? - person Topsic; 28.12.2012
comment
@Ceilingbat: объявите Component перед определением Sprite внутри пространства имен и наоборот. - person Mike Seymour; 28.12.2012
comment
@Ceilingbat Охранники включения только предотвращают бесконечное рекурсивное включение. Начните с Component.h и в голове сделайте включения. Обратите внимание, что над Sprite не будет определения компонента. - person Joseph Mansfield; 28.12.2012
comment
Спасибо, я решил это. Раньше я не знал о предварительных объявлениях, начну использовать их там, где это уместно. - person Topsic; 28.12.2012