自从我上次使用单独的编译进行编码以来已经有一段时间了,所以我有点尴尬,因为我无法弄清楚是什么导致了这样的基本错误。
这是我的“ SpaceInvader.h”文件中的相关代码:
#pragma once
#include "ClassDemoApp.h"
#include "SpriteSheet.h"
#include "Bullet.h"
#include <vector>
class Character{
public:
Character(float newU, float newV, float newWidth, float newHeight, float newX, float newY, std::vector <Bullet> newVolley);
private:
float thisU;
float thisV;
float thisWidth;
float thisHeight;
float xPos;
float yPos;
bool isDead;
std::vector <Bullet> volley;
};
我C2065: 'Bullet' : undeclared identifier
在构造函数和私有变量声明中得到了a 。
作为记录,这是我的“ Bullet.h”文件:
#pragma once
#include "SpriteSheet.h"
class Bullet{
public:
Bullet(float u, float v, float w, float h, const char *name);
void normalFire();
private:
float bulletU;
float bulletV;
float bulletW;
float bulletH;
const char *imageName;
};
我想了解我在这里做错误的,因为我的子弹类是正在申报,但我不知道为什么编译器不能识别它。
您很可能在标头依赖项中存在一个循环。像Bullet.h这样的东西包括SpriteSheet.h,其中包括SpaceInvader.h,它试图再次包含Bullet.h,这将被忽略(因为它已经被包含)。
这意味着在编译器处理SpaceInvader.h时,它不知道是什么Bullet
,因为它尚未完全处理Bullet.h。
有关发生的情况的更多详细信息:编译器命中#include行时,它基本上会读取整个文件,并将#include替换为文件的内容。然后,它将继续处理刚刚包含的代码,并且对包含的所有内容都将执行相同的操作。如果您有两个相互包含的文件,则最终将导致循环和编译器错误。
改变行为的一件事是#pragma once
指令,这意味着每个编译头仅包含一次。
但是,所有操作#pragma once
实际上是替换#include
已经用空白文本完成的文件的任何语句。
您可以认为它就像在文本编辑器中一样,只是将整个包含文件剪切并粘贴到该#include
行所在的位置。实际上,在这种情况下,我建议这样做以查看出了什么问题-将原始cpp剪切并粘贴到一个空白文档中,然后一次将#include
其替换为文本内容。如果您为已经完成的文件使用#include,只需将其删除即可。
因此,在您的情况下,发生的情况是Bullet
该类的定义在编译器正在构建的文件中仍位于更下方。
在这种情况下,最简单的解决方案是不包含SpaceInvader.h的Bullet.h,而只是向前声明该类。删除包含并使用此行:
class Bullet;
编辑:注意-您必须在SpaceInvader.cpp中包含Bullet.h,以便编译器在开始使用它之前就知道它是什么。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句