在编译我正在为教育目的而工作的小游戏时,我收到一个未声明的标识符错误,我无法理解为什么以及它来自何处。非常感谢任何帮助。
为什么我的“激光头”文件中的以下行会生成未声明的标识符错误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_
还有Alien的头文件:
#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
答案 0 :(得分:5)
这是循环包含依赖的典型例子。 Laser.hpp
文件需要Alien.hpp
文件,该文件需要Laser.hpp
文件,依此类推。
在这种情况下,Laser.hpp
根本不需要Alien.hpp
文件,只需要知道有一个名为Alien
的类。因此,要解决此问题,请在Alien.hpp
中删除Laser.hpp
,并添加Alien
类的声明:
class Alien;
答案 1 :(得分:1)
这是因为包含递归头文件。请注意,laser.h
包括alien.h
,其中再次包含laser.h
。这个东西,编译器无法做到,即使是w / header守卫。你需要的是一个前向声明,而不是#include "Alien.h"
添加一个声明class Alien;
,这在你的情况下是足够的,因为你只使用一个指向Alien
类的指针。