错误:预期')'在标题

时间:2015-08-07 20:32:43

标签: c++

我正在制作一个程序,其中有一个有剑的英雄。我有两个班级。在标题中,我在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

2 个答案:

答案 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。编译器只需要知道Heroclass

您可以在Hero.h中执行相同操作:将#include <Sword.h>替换为class Sword;。然后,您可以将文件包含在相应的.cpp文件中,您需要这些文件才能使用这些类。

经验法则:始终使用前向声明,除非整个标题需要包含在内。

进一步阅读:When can I use a forward declaration?

答案 1 :(得分:0)

看起来你有一个循环依赖。您可以使用前向声明修复它:

class Hero; //in Sword.h, before defining Sword

class Sword; //in Hero.h, before defining Hero