C ++:包含内部包含

时间:2014-02-13 18:34:57

标签: c++ inclusion

标题可能不是很清楚,它有点复杂。我在网上搜索了类似我的问题,但我找不到任何可以帮助我的东西 这不是关于无限循环包含,我已经放置了预处理器指令来避免这种情况。

我有两个类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中时,它尚未声明。
我不知道如何解决这个问题。

有什么想法吗?

4 个答案:

答案 0 :(得分:3)

这种方式的工作方式是char和monster的头文件不相互包含。相反,您转发声明类并在CPP文件中包含标题。

所以基本上将.h中的#include "monster.hpp"替换为.cpp中的class Monster;#include "monster.hpp" - 并且对于其他类也是如此。

有关详细信息,请参阅此问题:

What are forward declarations in C++?

答案 1 :(得分:0)

#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

答案 2 :(得分:0)

您需要使用前向声明。请参阅:http://en.wikipedia.org/wiki/Forward_declaration

基本上,编译器不知道“字符”是什么。您可以通过将以下存根添加到Character.hpp来临时指出您可以指向的内容:

class Character;

答案 3 :(得分:0)

在* .h:

中使用预先声明
class Character;
class Monster;

在* cpp中使用包括:

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

或者用预先声明将所有内容放在一个* .hpp中。