C++:内含物内部的内含物
C++: Inclusion inside inclusion
标题可能不太清楚,比这更复杂。我在网上搜索了类似我的问题,但没有找到任何可以帮助我的东西。
这不是关于无限循环包含,我已经放了预处理器指令来避免这种情况
我有两个类Monster和Character,分别在它们自己的头文件Monster.hpp和Character.hpp中声明,并分别在它们各自的源文件Monster.cpp和Character.cpp中实现。
现在的问题是两个类都需要彼此工作。
怪物.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
字符.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.hp中时,该类还没有声明。
我不知道如何解决这个问题。
有什么想法吗?
这样做的方式是char和monster的头文件不包括彼此。相反,您转发声明类,并将头包含在CPP文件中。
因此,基本上将.h中的#include "monster.hpp"
替换为.cpp中的class Monster;
和#include "monster.hpp"
,其他类也是如此。
有关更多详细信息,请参阅此问题:
C++中的正向声明是什么?
#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"。您可以通过在Character.hpp中添加以下存根来临时指示它是可以指向的:
类字符;
在*.h:中使用预先声明
class Character;
class Monster;
在*cpp中使用包括:
#include "character.h"
#include "monster.h"
或者将所有内容都放在一个*.hpp中,并预先声明。
- 将函数类成员映射到类本身内部
- Boost Spirit,获取迭代器内部语义动作
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 内联函数中具有内部链接的全局变量
- 在函数内部的声明中初始化数组,并在外部使用它
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 卷曲bracers内部结构的声明
- 从函数角度看ID到文件路径的内部与外部映射
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 如何在pugixml中获取节点的内部XML
- 使用C链接在函数内部创建C++模板
- 指针没有更新它在void函数内部指向的值
- 方法内部但循环仍得到预期的不合格id错误C++
- C++:具有内部链接的正向声明常量
- SDL_PollEvent() 无法捕获类函数内部SDL_QUIT?
- libcurl 和 DNS ttl 中的内部连接管理
- 如何修改 lambda 内部字符串的向量
- 如果我将嵌套映射作为多重映射的值,如何将值插入内部映射?
- 来自 Android 应用程序内部的 boost 类型的 boost::wrapexcept<boost::system::system_error> 的未捕获异常
- 类内部和外部静态 constexpr 元组之间的差异