0

我有一个名为 A 的类,它有它的.cpp.hpp文件。这取决于类BC. 现在,我想知道,我应该#include B.hppand #include C.hppin A.cpporA.hpp吗?我认为这对我来说是有益#includeA.hpp,因为我正在创建一个B*'s 的向量,而且我不确定B如果我只转发声明它编译器是否会知道正确的大小(所以我不能t 指针正确递增)...通过“前向声明” class B;,我的意思是class C;A.hpp.

4

3 回答 3

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'已经被定义。

于 2012-09-21T13:29:14.680 回答
1

如果它是 的向量B*,则不需要包含B.hpp在其他标头中。前向声明很好。指针具有相同的大小,无论它们指向什么。

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

于 2012-09-21T10:54:59.830 回答
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.hppand ,编译器就可以推断出它的大小(类大小,指针大小总是相同的)。为什么?只是因为在文件中它知道正确的大小,因为. 我发现这个答案有助于理解我想说的话。C.hppA.cppcpp#include

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

于 2012-09-21T11:09:06.367 回答