2015-08-07 3 views
3

Я делаю программу, где есть Герой, у которого есть Меч. У меня есть класс для обоих. В заголовке я получаю ошибку: 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.

Я просмотрел другие сообщения и не нашел ничего, что помогло, поэтому любое данное будет оценено по достоинству.

EDIT: Вот содержание 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 
+1

Как 'Hero' определено? Кстати, вы должны использовать '' ... "' для включения файлов из одного и того же проекта и '<…>' только для внешних файлов. – emlai

+2

Woah ... В sword.h вы используете Hero.h, а затем в Hero.h вы используете sword.h – Srinath

+1

'Герой * меч,' что-то кажется неправильным здесь ... – emlai

ответ

7

Вы не можете включать Sword.h из Hero.h и Hero.h из Sword.h, цепь включения должна где-то остановиться. Вы можете использовать опережающее объявление исправить:

//#include <Hero.h> // remove this 

class Hero; // forward declaration 

class Sword { 
    public: 
     Sword(Hero* h); 
     virtual ~Sword(); 
}; 

Это работает, потому что вам не нужно определение Hero в Sword.h. Компилятор должен знать только, что Hero - это class.

Вы можете сделать то же самое в Hero.h: заменить #include <Sword.h> на class Sword;. Затем вы можете включить файлы в соответствующие .cpp-файлы, где вам нужны определения, чтобы использовать классы.

Эмпирическая: всегда использовать вперед декларацию, если весь заголовок необходимо не должны быть включены.

Дальнейшее чтение: When can I use a forward declaration?

+0

Спасибо, он отлично справился после внесения изменений. – Pithon3

0

Похоже, у вас есть циклическую зависимость. Вы можете это исправить с форвардным декларациями:

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

class Sword; //in Hero.h, before defining Hero 
Смежные вопросы