继承(通过文件)无法找到类?

时间:2016-03-08 09:39:18

标签: c++ class inheritance

我试图通过多个标题和cpp文件使用继承来处理我正在编写的文本游戏。

我有武器的基类。这是在Weapon.h文件中。

class Weapon
{
    public:
        string Name;
        int Damage;
        float ChanceToHit;
        int ExtraDamage;
        int Result;
        int Array[3];
        int Attack(int, int, string);
};

然后我尝试将基础Weapon.h类继承到Bow and Sword类。我确信我正确地包含了文件,但是当我尝试编译时,我收到错误“错误:期望的类名类Blade:公共武器” Bow类的错误相同。

#include "Weapon.h"
#include "Crossbow.h"

using namespace std;

class Bow : public Weapon
{
    public:
        string Type = "Ranged";
        bool loaded;
    protected:
        Bow();
}; 

#include "Weapon.h"
class Blade : public Weapon
{
    private:
        string Type = "Melee";
    protected:


  void Draw();
};

有谁知道为什么会这样?谷歌也没有出现任何有用的东西。感谢

MCVE(我认为)

//In Base.h
class Base
{
 public:
    int function();
 private:
};

//In Base.cpp
int Base::function()
{
    randomshit
    return 0;
}

//In Inherit.h
#include "Base.h"
class Inherit : public Base
{
public:
    int function():
private:
};

Getting error: "expected class name class Bow : public Weapon"

编辑:结果我需要包含“#pragma once”,几乎解决了所有问题。谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

您没有使用任何包含警戒,因此您的文件Weapon.h可能会被多次包含,从而导致编译错误。

要了解有关包含警卫的更多信息:https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Include_Guard_Macro

您的标题Weapon.h将成为:

#ifndef WEAPON_H_INCLUDED
#define WEAPON_H_INCLUDED

class Weapon
{
public:
    string Name;
    int Damage;
    float ChanceToHit;
    int ExtraDamage;
    int Result;
    int Array[3];
    int Attack(int, int, string);
};

#endif // WEAPON_H_INCLUDED

对所有其他头文件执行相同操作。

完成后,删除所有不必要的包含并执行干净的重建。

答案 1 :(得分:0)

这可能不是答案,但不可能将其作为评论发布

这在我的Visual Studio 2013上编译(但不链接!!)。

#include <string>

using namespace std;

class Weapon
{
    public:
        string Name;
        int Damage;
        float ChanceToHit;
        int ExtraDamage;
        int Result;
        int Array[3];
        int Attack(int, int, string);
};    

class Bow : public Weapon
{
    public:
        string Type = "Ranged";
        bool loaded;
    protected:
        Bow();
};     

class Blade : public Weapon
{
    private:
        string Type = "Melee";
    protected:    
        void Draw();
};

但由于声明初始化为string Type = "Melee";,因此旧版编译器可能会失败。

请注意,using namespace std;在声明class Weapon之前