前瞻性声明的缺点是什么?

Ant*_*ton 3 c++ forward-declaration

我想知道在可能的情况下在所有地方使用前向声明是否有任何缺点.这是我的标题只包含声明.

据我所知,使用前向声明可加快编译时间,但我不知道有什么缺点.

例:

啊:

Class A
{
};
Run Code Online (Sandbox Code Playgroud)

BH:

// Should I use and include "a.h" in the cpp file (e.g., a.cpp)
Class A;
Class B
{
    doSomething(A *a);
    A *myA;
};
Run Code Online (Sandbox Code Playgroud)

或者它是否更好用

BH:

#include "a.h"

Class B
{
    doSomething(A *a);
    A *myA;
};
Run Code Online (Sandbox Code Playgroud)

das*_*ght 10

使用前向声明可以改善解耦.如果您可以"A.h"通过使用前向声明来避免包含,那么使用前向声明是个好主意.最好不仅因为你的构建运行得更快(毕竟,预处理的头文件可以很好地处理编译器的效率),但是因为它告诉读者你的声明你的类的结构B不依赖于你对类的了解A,其他比它存在*.

编辑(回答你的问题)来转发的声明,我知道的是,你不能在所有情况下使用它们唯一的缺点:例如,类似这样的声明:

class B
{
    A myA[10];
};
Run Code Online (Sandbox Code Playgroud)

不会编译,因为编译器需要知道的大小A.但是,编译器可以非常可靠地发现这些问题,并以明确的方式通知您.

*类的实现B很可能取决于知道类的细节A.但是,这种依赖关系成为B隐藏在您的类用户中的实现细节; 您可以随时更改它而不会破坏依赖于类的代码B.