单独编译中未声明的标识符

克莱姆

自从我上次使用单独的编译进行编码以来已经有一段时间了,所以我有点尴尬,因为我无法弄清楚是什么导致了这样的基本错误。

这是我的“ 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章