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上面不会有组件的定义。