【问题标题】:Undeclared identifier in function parameter函数参数中未声明的标识符
【发布时间】:2013-08-19 23:59:09
【问题描述】:

我在编译我正在为教育目的开发的小游戏时遇到未声明的标识符错误,我无法让全世界了解它的原因和来源。非常感谢任何帮助。

为什么我的“激光头”文件中的以下行会生成未声明的标识符错误 C2065?

bool hit(std::vector<Alien*> aliens);

这是完整的头文件:

#ifndef LASER_HPP_
#define LASER_HPP_

#include "Ship.h"
#include "Alien.h"
#include "Vector.h"

class Laser : public Sprite {
    private :
        bool armed;
        int reloadTime, width, height, radius;

        std::vector<Vector> bullets;

        bool circleCollision(int x, int y, Ship* ship);
        void reload();
    public:
        enum Type {
            RED,
            BLUE
        };

        Laser(Type type);

        bool hit(std::vector<Alien*> aliens);
        bool hit(Ship* ship);
        void shoot(int x, int y, int dy);
        void update();
        void draw();
};

#endif LASER_HPP_

还有外星人的头文件:

#ifndef ALIEN_HPP_
#define ALIEN_HPP_

#include "Laser.h"
#include "Ship.h"

class Alien : public Ship {
    private:
        int nextX, laserSpeed, shotDelay;
        bool attacking;
        time_t lastShot;

        bool targetReached();
        bool timeToShoot();
        bool enteringStage();

        void shoot();
        void move();
        void init();
    public:
        Alien();
        Alien(const char* filename);
        Laser* laser;

        void setNextTarget();
        void update();
        void attack();
        void die();
};

#endif ALIEN_HPP_

我正在使用 VisualStudio 2012:S

错误:

 error C2065: 'Alien' : undeclared identifier

【问题讨论】:

  • 究竟什么是未定义的,哪个符号?
  • 对不起,刚刚意识到。现在添加信息。第 25 行是包含列在顶部的第一个“命中”函数的行。

标签: c++ winapi header-files


【解决方案1】:

这是一个循环包含依赖的经典例子。 Laser.hpp文件需要Alien.hpp文件需要Laser.hpp文件等等。

在这种情况下,Laser.hpp 根本不需要Alien.hpp 文件,它只需要知道有一个名为Alien 的类。因此,要解决问题,您可以删除 Laser.hpp 中包含的 Alien.hpp,并添加 Alien 类的声明

class Alien;

【讨论】:

  • 是的,这也是我的建议。
  • 非常好!非常感谢!
【解决方案2】:

这是因为包含递归头文件。考虑一下,laser.h 包括alien.h,其中又包括laser.h。这件事,编译器做不到,即使有头保护。您需要的是前向声明,而不是 #include "Alien.h" 添加声明 class Alien;,这在您的情况下就足够了,因为您只使用指向 Alien 类的指针。

【讨论】:

    猜你喜欢
    • 2013-08-27
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多