我可以#包括在.hpp文件中吗
May I #include in .hpp files?
我有一个名为a的类,它有.cpp
和.hpp
文件。它依赖于类B
和C
。现在,我想知道,我应该在A.cpp
还是A.hpp
中使用#include B.hpp
和#include C.hpp
?我认为在A.hpp
文件中使用#include
对我来说是有益的,因为我正在创建B*
的向量,如果我只向前声明B
,我不确定编译器是否会知道它的正确大小(所以我无法正确地指针增量)。。。所谓"前向声明",我指的是在A.hpp
的开头写class B;
和class C;
。
如前所述,您通常可以通过使用前向声明来解决必须使用#include
的问题,实际上,最佳实践是最大限度地减少包含的其他标头的数量。
但是:为了回答你的问题,标题是:是的,你可以,避免"循环包容"的常见机制是以下
A.hpp:
#ifndef A_HPP_INCLUDED
#define A_HPP_INCLUDED
... // code
#endif
现在,如果说B.hpp包括A.hpp,那么随后,C.hpp看起来像:
#ifndef C_HPP_INCLUDED
#define C_HPP_INCLUDED
#include "A.hpp"
#include "B.hpp"
...
#endif
这样就不会出现错误,说明例如已经定义了"class A"。
如果它是B*
的向量,则不需要在另一个标头中包含B.hpp
。远期申报可以。指针大小相同,无论它们指向什么。
只有在必要的时候才有include,这看起来肯定不是。
我不知道我是否理解你的类层次结构,我的想法是这样的:
B.hpp
class B
{
B();
};
B.cpp
B::B() {};
C.hpp
class C
{
C();
};
A.cpp
A::A() {};
A.hpp
class A
{
A();
B *b;
C *C;
};
A.cpp
#include "B.hpp"
#include "C.hpp"
A::A() :
b(NULL), c(NULL)
{
};
这是正确的吗?(如果没有,请考虑提供一些代码;)如果您的class A
有指向class B
和class C
的指针,那么您必须只需要前向声明。
如果我只转发声明为,我不确定编译器是否会知道B的正确大小
是的,只要在A.cpp
文件中包含B.hpp
和C.hpp
,编译器就可以推断其大小(类大小和指针大小始终相同)。为什么?只是因为在cpp
文件中,它知道由于#include
而导致的正确大小。我发现这个答案对理解我想说的话很有用。
在hpp
文件中可以吗?也许,如果您的A.hpp
不包含在其他文件中,那么class B
和class C
就不会麻烦并扩展到其他文件中。因此,如果是这样的话,那就没有必要了。但IMHO的最佳实践是尽可能在cpp
文件中转发声明和#include
。
- 如何将class.cpp和class.hpp编译为一个.o文件
- g++ -I 和 -L 命令来查找不起作用的 .hpp 文件
- Gnuplot_i.hpp C++接口绘制局部变量而不是文件
- 致命错误:找不到'boost/uuid/uuid.hpp'文件
- 造成致命错误:boost/fusion/iterator/equal_to.hpp 没有这样的文件或目录
- 无法使包含.hpp文件与其中的2个文件一起使用
- 在指向现有内存地址的 hpp 文件中声明成员函数的最佳方法
- 无法打开包含文件'Graphics.hpp'没有这样的文件或目录,Visual Studio的其他包含不起作用
- 编译器正在查找.当"实施"完全在"我的"中时的CPP文件.HPP文件
- 我的项目中某些仅标头文件不能包含使用 CMake 和 Vscode 的"SFML/Graphics.hpp"
- 如何正确使用hpp文件和cpp文件中的嵌套类
- 错误: C1083: 无法打开包含文件:"boost/asio.hpp": 没有此类文件或目录
- 从一个cpp中给出所使用的头文件和hpp文件的列表
- 如何在 CMakeList 中包含 h/hpp 头文件.txt而不是 cpp 或其他 hpp 文件
- CMake add_executable() 使用.cpp文件或 .hpp 文件
- <opencv2/opencv.hpp>, <opencv2/imgproc.hpp>, <opencv2/highgui.hpp> 没有这样的文件或目录
- 添加 boost 文件系统.hpp 无法编译
- 我可以使用 cmake/make 编译我使用的所有且仅编译 cpp/hpp 文件吗?
- 将函数及其实现移动到与主文件不同的文件(.hpp 和 .cpp)时,性能会受到很大影响
- 如何使用g++获取C++头文件(.hpp)的程序集代码