C++:包含内包含

标签 c++ inclusion

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

我有两个类Monster和Character,分别在自己的头文件monster.hppcharacter.hpp中声明,并分别在自己的源文件中实现, monster.cppcharacter.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 的头文件不互相包含。相反,您可以转发声明类并将 header 包含在 CPP 文件中。

因此,基本上将 .h 中的 #include "monster.hpp" 替换为 class Monster;#include "monster.hpp"在 .cpp 中 - 与其他类相同。

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

What are forward declarations in C++?

关于C++:包含内包含,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21762678/

相关文章:

c++ - 无法识别 C++ 中的字符串数据类型

c++ - realloc() 问题,未分配

c++ - 专门针对受约束的非类型参数模板化的类

c++ - 子类递归方法调用

c++ - 头文件相互包含

c - 使用静态库编译的共享库中 undefined symbol

php - 包含语言文件时的本地文件包含漏洞

ruby-on-rails - Rails 包含验证

c++ - 包含守卫的问题

c++ - 为什么 "possible lack of precision"不是编译器错误?