C ++: включение внутри включения

Название может быть не очень понятным, оно немного сложнее. Я искал в Интернете что-то вроде моей проблемы, но я не нашел ничего, что могло бы мне помочь.
Речь идет не о включениях с бесконечным циклом, я уже добавил директивы препроцессора, чтобы избежать этого.

У меня есть два класса 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.
И я не знаю, как это исправить.

Есть идеи ?

2

Решение

Это работает так, что заголовочные файлы char и monster не включают друг друга. Вместо этого вы пересылаете объявления классов и включаете заголовки в файлы CPP.

Так что в основном заменить #include "monster.hpp" в.ч с class Monster; а также #include "monster.hpp" в .cpp — и то же самое для другого класса.

Смотрите этот вопрос для более подробной информации:

Что такое предварительные объявления в C ++?

3

Другие решения

#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
0

Вам необходимо использовать предварительную декларацию. Увидеть: http://en.wikipedia.org/wiki/Forward_declaration

По сути, компилятор не знает, что такое «символ». Вы временно указываете, что на это можно указать, добавив следующую заглушку в Character.hpp:

класс персонажа;

0

Использовать предикларацию в * .h:

class Character;
class Monster;

использовать в * cpp включает в себя:

#include "character.h"#include "monster.h"

Или поместите все в один * .hpp с предварительным объявлением.

0
По вопросам рекламы [email protected]