我可以在.hpp文件中#include吗?

时间:2012-09-21 10:52:43

标签: c++ class pointers compiler-construction forward-declaration

我有一个名为A的类,它有.cpp.hpp个文件。这取决于班级BC。现在,我想知道,#include B.hpp#include C.hpp中我应该A.cppA.hpp吗?我认为#include文件中的A.hpp对我有好处,因为我正在创建B*的向量,我不确定编译器是否会知道正确的B大小如果我只是向前声明它(所以我不能正确地指针增加)......通过“前向声明”,我的意思是在class B;class C;写入开始A.hpp

3 个答案:

答案 0 :(得分: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

然后你不会得到一个错误说明,例如'A级'已经定义。

答案 1 :(得分:1)

如果它是B*的向量,则无需在其他标头中包含B.hpp。前瞻性声明没问题。无论指向什么,指针都具有相同的大小。

最好只在必要时才包含,这肯定看起来不是。

答案 2 :(得分:1)

我不知道我是否理解你的班级等级,在我看来是这样的:

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的正确大小

是的,只要在B.hpp文件中包含C.hppA.cpp,编译器就能够推断出它的大小(类大小,指针大小始终是相同)。为什么?只是因为在cpp文件中它知道#include的正确大小。我发现this answer有助于理解我想说的内容。

hpp文件中会好吗?也许,如果您的A.hpp不会包含在其他文件中,则class Bclass C不会打扰并传播到其他文件中。所以,如果情况不是必要的话。但恕我直言,最佳做法是在可能的情况下在#include文件中转发声明和cpp