2016-03-08 3 views
-2

Im пытается использовать Наследование через несколько файлов заголовков и 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 к классу лук и меч. Я уверен, что включаю файл правильно, но когда я пытаюсь скомпилировать, я получаю сообщение об ошибке "error: expected class name class Blade: public Weapon" Такая же ошибка для класса 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(); 
}; 

Кто-нибудь знает, почему это происходит? Google не подходит ни к чему полезному. Благодаря

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" 

EDIT: Оказывается, мне нужно, чтобы включить "#pragma раз" и решить практически все. Спасибо за помощь, ребята!

+0

В какой строке вы видите ошибку? Что находится в 'crossbow.h'? –

+3

Вероятно, круглая зависимость. Но почему вы '#include" CrossBow.h "? – juanchopanza

+0

@MichaelWalz Я получаю сообщение об ошибке в строке «class Bow», то же самое для класса Blade. Для Арбалета я наследую класс Bow.Я просто включил в нее #include, потому что я не мог придумать ничего другого, что могло бы решить мою проблему. Я также получаю эту проблему в файле Crossbow.h. По какой-то причине я не получаю проблему, когда наследую в том же файле. – Matt

ответ

-2

В вашем классе Оружия нет конструктора.

Это работает для меня:

Weapon.h

#ifndef WEAPON_H 
#define WEAPON_H 

#include <string> 

using namespace std; 

class Weapon 
{ 
public: 
    Weapon(); 

    string Name; 
    int Damage; 
    float ChanceToHit; 
    int ExtraDamage; 
    int Result; 
    int Array[3]; 
    int Attack(int, int, string); 
}; 

#endif // WEAPON_H 

Blade.h:

#ifndef BLADE_H 
#define BLADE_H 

#include "weapon.h" 

class Blade : public Weapon 
{ 
public: 
    Blade(); 

private: 
    string Type = "Melee"; 

protected: 
    void Draw(); 
}; 

#endif // BLADE_H 
+0

ничего не меняет – Matt

+0

Вы пытались запустить мой код? – Paraboloid87

+0

У вас все еще такая же ошибка? – Paraboloid87

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 

сделать то же самое для всех других файлов заголовков.

Как только вы это сделали, удалите все ненужные включения и выполните чистую перестройку.

+0

Ссылка только ответы не приветствуются - добавить более подробно –

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.

+0

Спасибо, что я, вероятно, собираюсь только начать полностью и посмотреть, сохраняются ли проблемы. – Matt

Смежные вопросы