我有一个名为A的类,它有.cpp
和.hpp
个文件。这取决于班级B
和C
。现在,我想知道,#include B.hpp
或#include C.hpp
中我应该A.cpp
和A.hpp
吗?我认为#include
文件中的A.hpp
对我有好处,因为我正在创建B*
的向量,我不确定编译器是否会知道正确的B
大小如果我只是向前声明它(所以我不能正确地指针增加)......通过“前向声明”,我的意思是在class B;
和class C;
写入开始A.hpp
。
答案 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 B
和class C
,则前提声明必须是您唯一需要的。
如果我只转发声明
,我不确定编译器是否知道B的正确大小
是的,只要在B.hpp
文件中包含C.hpp
和A.cpp
,编译器就能够推断出它的大小(类大小,指针大小始终是相同)。为什么?只是因为在cpp
文件中它知道#include
的正确大小。我发现this answer有助于理解我想说的内容。
在hpp
文件中会好吗?也许,如果您的A.hpp
不会包含在其他文件中,则class B
和class C
不会打扰并传播到其他文件中。所以,如果情况不是必要的话。但恕我直言,最佳做法是在可能的情况下在#include
文件中转发声明和cpp
。