一个人应该使用前向声明而不是包含吗?

每当一个类声明仅将另一个类用作指针时,使用一个类正向声明而不是包括头文件是否有意义,以抢先避免循环依赖问题?因此,与其具有:


//file C.h

#include "A.h"

#include "B.h"


class C{

    A* a;

    B b;

    ...

};

改为这样做:


//file C.h

#include "B.h"


class A;


class C{

    A* a;

    B b;

    ...

};



//file C.cpp

#include "C.h"

#include "A.h"

...

有什么理由不这样做吗?


C ++ 前向声明


慕斯709654
浏览 463回答 3
3回答

拉莫斯之舞

前向声明方法几乎总是更好。(我想不出包含可以使用前向声明的文件更好的情况,但我不会说总是最好以防万一)。前向声明类没有任何缺点,但是我可以想到一些不必要的包含标头的缺点:编译时间更长,因为包括在内的所有翻译单元C.h也都将包含A.h,尽管他们可能不需要。可能包括您不需要间接使用的其他标头用不需要的符号污染翻译单元您可能需要重新编译包含该标头(如果更改)的源文件(@PeterWood)

温温酱

是的,使用前向声明总是更好。他们提供的一些优势是:减少编译时间。没有名称空间污染。(在某些情况下)可能会减小生成的二进制文件的大小。重新编译时间可以大大减少。避免潜在的预处理程序名称冲突。因此,实现PIMPL成语提供了一种从接口隐藏实现的方法。但是,向前声明一个类会使该特定类成为不完整类型,并且严格地限制了您可以对不完整类型执行的操作。您无法执行需要编译器知道类布局的任何操作。使用不完整类型,您可以:声明一个成员是对不完整类型的指针或引用。声明接受/返回不完整类型的函数或方法。定义接受/返回不完整类型的指针或引用的函数或方法(但不使用其成员)。使用不完整类型,您不能:将其用作基类。用它声明一个成员。使用此类型定义函数或方法。

慕工程0101907

有什么理由不这样做吗?方便。如果您提前知道该头文件的任何用户一定也需要包括A做任何事情的定义(或者可能大多数时候)。然后,将其一劳永逸地包含进去很方便。这是一个相当棘手的主题,因为过于宽松地使用此经验法则将产生几乎无法编译的代码。请注意,Boost通过提供特定的“便利”标头以不同的方式解决该问题,该标头将几个紧密的功能捆绑在一起。
打开App,查看更多内容
随时随地看视频慕课网APP