函数参数中未声明的标识符

Undeclared identifier in function parameter

本文关键字:标识符 未声明 参数 函数      更新时间:2023-10-16

我在编译我正在为教育目的而开发的小游戏时收到一个未声明的标识符错误,我无法为世界理解它的原因和来源。任何帮助将不胜感激。

为什么我的"激光标头"文件中的以下行会生成未声明的标识符错误 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

这是循环包含依赖的一个典型示例。Laser.hpp文件需要Alien.hpp文件,而文件需要Laser.hpp文件,依此类推。

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

class Alien;

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