Название может быть не очень понятным, оно немного сложнее. Я искал в Интернете что-то вроде моей проблемы, но я не нашел ничего, что могло бы мне помочь.
Речь идет не о включениях с бесконечным циклом, я уже добавил директивы препроцессора, чтобы избежать этого.
У меня есть два класса Monster и Character, соответственно объявленные в их собственных заголовочных файлах, monster.hpp а также character.hpp, и соответственно реализованы в собственных исходных файлах, monster.cpp а также character.cpp.
Проблема в том, что оба класса нужны друг другу для работы.
monster.hpp :
#ifndef INCLUDE_MONSTER_HPP
#define INCLUDE_MONSTER_HPP
#include "character.hpp"
class Monster
{
private: //Atributes
public: //Methods
void attackM(Monster& id);
void attackC(Character& id);
};
#endif //MONSTER_HPP_INCLUDED
character.hpp :
#ifndef INCLUDE_CHARACTER_HPP
#define INCLUDE_CHARACTER_HPP
#include "monster.hpp"
class Character
{
private: //Attributes
public: //Methods
void attackM(Monster& id);
void attackC(Character& id);
};
#endif //CHARACTER_HPP_INCLUDED
и main.cpp :
#include <iostream>
#include "character.hpp"#include "monster.hpp"
using namespace std;
int main(int argc, char **argv)
{
//Whatever
return 0;
}
И я получаю эту ошибку от компилятора:
In file included from character.hpp:7:0,
from main.cpp:3:
monster.hpp:24:16: error: 'Character' has not been declared
void attackC(Character& id);
(номера строк и столбцов могут быть неправильными)
Из того, что я понимаю, когда monster.hpp включен в character.hpp, компилятор видит, что класс Monster использует класс Character, который еще не объявлен в тот момент, когда monster.hpp включен в character.hpp.
И я не знаю, как это исправить.
Есть идеи ?
Это работает так, что заголовочные файлы char и monster не включают друг друга. Вместо этого вы пересылаете объявления классов и включаете заголовки в файлы CPP.
Так что в основном заменить #include "monster.hpp"
в.ч с class Monster;
а также #include "monster.hpp"
в .cpp — и то же самое для другого класса.
Смотрите этот вопрос для более подробной информации:
#ifndef INCLUDE_MONSTER_HPP
#define INCLUDE_MONSTER_HPP
#include "character.hpp"
class Character;
class Monster
{
private: //Atributes
public: //Methods
void attackM(Monster& id);
void attackC(Character& id);
};
#endif //MONSTER_HPP_INCLUDED
Вам необходимо использовать предварительную декларацию. Увидеть: http://en.wikipedia.org/wiki/Forward_declaration
По сути, компилятор не знает, что такое «символ». Вы временно указываете, что на это можно указать, добавив следующую заглушку в Character.hpp:
класс персонажа;
Использовать предикларацию в * .h:
class Character;
class Monster;
использовать в * cpp включает в себя:
#include "character.h"#include "monster.h"
Или поместите все в один * .hpp с предварительным объявлением.