我可以#包括在.hpp文件中吗

May I #include in .hpp files?

本文关键字:文件 hpp 包括 我可以      更新时间:2023-10-16

我有一个名为a的类,它有.cpp.hpp文件。它依赖于类BC。现在,我想知道,我应该在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 Bclass C的指针,那么您必须只需要前向声明。

如果我只转发声明为,我不确定编译器是否会知道B的正确大小

是的,只要在A.cpp文件中包含B.hppC.hpp,编译器就可以推断其大小(类大小和指针大小始终相同)。为什么?只是因为在cpp文件中,它知道由于#include而导致的正确大小。我发现这个答案对理解我想说的话很有用。

hpp文件中可以吗?也许,如果您的A.hpp不包含在其他文件中,那么class Bclass C就不会麻烦并扩展到其他文件中。因此,如果是这样的话,那就没有必要了。但IMHO的最佳实践是尽可能在cpp文件中转发声明和#include