我有一个名为 A 的类,它有它的.cpp
和.hpp
文件。这取决于类B
和C
. 现在,我想知道,我应该#include B.hpp
and #include C.hpp
in A.cpp
orA.hpp
吗?我认为这对我来说是有益#include
的A.hpp
,因为我正在创建一个B*
's 的向量,而且我不确定B
如果我只转发声明它编译器是否会知道正确的大小(所以我不能t 指针正确递增)...通过“前向声明” class B;
,我的意思是class C;
在A.hpp
.
3 回答
正如已经提到的,您通常可以#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
在其他标头中。前向声明很好。指针具有相同的大小,无论它们指向什么。
最好只在必要时才包含,这当然看起来不是。
我不知道我是否理解你的类层次结构,在我看来是这样的:
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 的正确大小
是的,只要你在文件中包含B.hpp
and ,编译器就可以推断出它的大小(类大小,指针大小总是相同的)。为什么?只是因为在文件中它知道正确的大小,因为. 我发现这个答案有助于理解我想说的话。C.hpp
A.cpp
cpp
#include
hpp
在文件中会很好吗?也许,如果您A.hpp
不会包含在其他文件中,class B
并且class C
不会打扰并传播到其他文件中。所以,如果是这种情况,那就没有必要了。#include
但恕我直言,最好的做法是在可能的情况下转发声明和cpp
文件。