我正在制作一个程序,其中有一个有剑的英雄。我有两个班级。在标题中,我在Sword标题中的expected ')' before '*' token
行上收到错误:Sword(Hero* h);
。这是竞争文件(Sword.h):
#ifndef SWORD_H
#define SWORD_H
#include <Hero.h>
class Sword {
public:
Sword(Hero* h);
virtual ~Sword();
};
#endif // SWORD_H
Hero.h与Hero.h位于同一目录中,我正在使用Code :: Blocks。
我查看了其他帖子,找不到任何有用的内容,所以任何给定的内容都会受到赞赏。
编辑: 以下是Hero.h的内容:
#ifndef HERO_H
#define HERO_H
#include <string>
#include <SDL.h>
#include <SDL_image.h>
#include <stdio.h>
#include <Sword.h>
#include <Sprite.h>
#include <Window.h>
class Hero : public Sprite {
public:
Hero(Window* w);
void update();
void event(SDL_Event e);
~Hero();
protected:
private:
bool up;
bool right;
bool left;
bool down;
Window* window;
Sword* sword;
};
#endif // HERO_H
答案 0 :(得分:7)
你不能包含来自Hero.h的Sword.h和来自Sword.h的Hero.h,包含链必须在某处停止。您可以使用转发声明来修复它:
//#include <Hero.h> // remove this
class Hero; // forward declaration
class Sword {
public:
Sword(Hero* h);
virtual ~Sword();
};
这是有效的,因为您不需要在Sword.h中定义Hero
。编译器只需要知道Hero
是class
。
您可以在Hero.h中执行相同操作:将#include <Sword.h>
替换为class Sword;
。然后,您可以将文件包含在相应的.cpp文件中,您需要这些文件才能使用这些类。
经验法则:始终使用前向声明,除非整个标题需要包含在内。
答案 1 :(得分:0)
看起来你有一个循环依赖。您可以使用前向声明修复它:
class Hero; //in Sword.h, before defining Sword
class Sword; //in Hero.h, before defining Hero