[英]May I #include in .hpp files?
我有一个名为A的类,它具有其.cpp
和.hpp
文件。 它取决于类B
和C
现在,我想知道是否应该在A.cpp
或A.hpp
#include B.hpp
和#include C.hpp
A.hpp
? 我认为将#include
在A.hpp
文件中对我来说将是有益的,因为我正在创建B*
的向量,并且我不确定如果仅当编译器知道B
的正确大小时,向前声明它(所以我不能正确地增加指针)...“向前声明”是指编写class B;
class C;
在A.hpp
开始时。
如前所述,您通常可以通过使用前向声明来#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
这样,您将不会收到错误消息,说明例如已经定义了“ A类”。
如果它是B*
的向量,则无需在另一个标头中包含B.hpp
。 向前声明很好。 指针大小相同,无论它们指向什么。
最好仅在必要时才包含,而看起来确实没有。
我不知道我是否了解您的班级层次结构,在我看来是这样的:
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
和class C
class A
指针,则向前声明必须是您唯一需要的东西。
我不确定如果只向前声明它,编译器是否知道B的正确大小
是的,只要您在A.cpp
文件中包含B.hpp
和C.hpp
,编译器就可以推断出它的大小(类大小,指针大小始终相同)。 为什么? 仅仅因为在cpp
文件中,由于#include
它知道正确的大小。 我发现这个答案对理解我的意思很有帮助。
在hpp
文件中可以吗? 也许,如果您的A.hpp
不会包含在其他文件中,则class B
和class C
不会打扰并传播到另一个文件中。 因此,如果是这种情况,则不必要。 但是恕我直言,最佳实践是在可能的情况下将声明和#include
转发到cpp
文件中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.