C++ c++;错误C2065:未声明的标识符

C++ c++;错误C2065:未声明的标识符,c++,vector,compiler-errors,undeclared-identifier,C++,Vector,Compiler Errors,Undeclared Identifier,可能重复: 当我试图编译时,我得到了错误sprite.h(20):错误C2065:“组件”:未声明的标识符(我还得到了一些其他文件)。下面是sprite.h文件。我一辈子都搞不清楚是什么导致了这个问题 #ifndef SPRITE_H #define SPRITE_H #include "Image.h" #include "Rectangle.h" #include <string> #include <SDL.h> #include <vector>

可能重复:

当我试图编译时,我得到了错误
sprite.h(20):错误C2065:“组件”:未声明的标识符(我还得到了一些其他文件)。下面是
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
tick()
应该像现在一样接受两个向量,但也许有更好的方法来解决这个问题

编辑 根据要求,这里还有
组件.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
\ifndef组件
#定义组件
#包括“矩形.h”
#包括“组件h”
#包括“Sprite.h”
#包括
#包括
名称空间GE2D{
类组件{
公众:
组件();
虚拟组件();
虚拟空洞绘制(SDL_表面*屏幕)=0;
虚拟空白刻度(SDL_表面*屏幕,标准::矢量*精灵,标准::矢量*组件)=0;
虚拟无效handleEvent(SDL_事件eve)=0;
常量矩形&getRect()常量;
受保护的:
分量(整数x,整数y,整数w,整数h);
私人:
矩形矩形;
};
}
#恩迪夫

Sprite.h
包括
Component.h
,其中包括
Sprite.h
,给出了无法解决的循环依赖关系

幸运的是,您根本不需要包含标题。每个类只引用一个指向另一个类的指针,为此,一个简单的声明就足够了:

class Component;

Sprite.h
包括
Component.h
,其中包括
Sprite.h
,给出了无法解析的循环依赖关系

幸运的是,您根本不需要包含标题。每个类只引用一个指向另一个类的指针,为此,一个简单的声明就足够了:

class Component;

显示
Component.h的内容
您确定“Component.h”定义了一个名为“Component”的类型吗?@BoPersson,是的,看起来它们是一样的,我该怎么办?@Ceilingbat-您不必做任何事情,我们只是将它们链接在一起,以便下一个有相同问题的人更容易找到它们。显示
组件的内容。h
你确定“Component.h”定义了一个名为“Component”的类型吗?@BoPersson,是的,看起来它们是一样的,我该怎么办?@Ceilingbat-你不必做任何事情,我们只是将它们连接在一起,以便下一个有同样问题的人更容易找到它们。但是,是否应该包括警卫来解决这个问题?这不是他们的目的吗?编辑:哦,我看到你的answer@Ceilingbat:否,它们只能防止多个夹杂物。无法在
组件
之前定义
精灵
,在
精灵
之前定义
组件
。声明应该在哪里?@Ceilingbat:Declare
组件
精灵
定义之前,在命名空间内,反之亦然。@Ceilingbat include防护程序只能阻止它无限递归地包含。从组件.h开始,在你的头脑中进行包含。请注意,Sprite上面没有组件的定义。但是include卫士不应该解决这个问题吗?这不是他们的目的吗?编辑:哦,我看到你的answer@Ceilingbat:否,它们只能防止多个夹杂物。无法在
组件
之前定义
精灵
,在
精灵
之前定义
组件
。声明应该在哪里?@Ceilingbat:Declare
组件
精灵
定义之前,在命名空间内,反之亦然。@Ceilingbat include防护程序只能阻止它无限递归地包含。从组件.h开始,在你的头脑中进行包含。请注意,Sprite上面不会有组件的定义。