前向声明包括,声明包括(ClassFwd.h + Class.h)

Gee*_*eho 11 c++ include forward-declaration effective-c++

在Effective C++(第3版)中,Scott Meyers在第31项中建议,除了经典的声明(.h)和定义(.cpp)文件之外,类应该具有前向声明包含文件(fwd.h),哪个类不需要完整定义可以使用,而不是向前声明自己.

我有点看到它的情况,但我真的不认为这是一个可行的选择...它似乎很难维持,相当矫枉过正,几乎没有必要.

但是,我可以看到它用于模板前向声明,它相当重.但对于简单的课程?这似乎很难维护,并且会创建一大堆几乎空的包含文件,这些文件只是用于非常小的目的......值得麻烦吗?

这是一个例子:

// Class.h
class Class
{
    Class();
    ~Class();
};

// ClassFwd.h
class Class;

// Class.cpp
Class::Class()
{
}

Class::~Class()
{
}
Run Code Online (Sandbox Code Playgroud)

我的问题:

你们有什么感想?如果这是一个很好的做法?

注意我最感兴趣的是这个练习的论据,看看我是否错过了一些让我同意Scott Meyers的内容.

Dan*_*röm 6

我为我的所有库使用了前向声明头文件.库通常具有以下结构:

lib/
  include/
    class headers + Fwd.h
src/
  source files + internal headers
Run Code Online (Sandbox Code Playgroud)

lib/include目录将包含所有公共类标题以及一个前向声明标头.这使得图书馆在包含方面轻量化.此库外的任何标头仅包含转发标头(Fwd.h),而此库外的源包括必要的完整标头.还可以提供Lib.h包含所有其他标头的便利标头(),以便在源文件中使用.

在前向声明头中放置的另一个东西是typedefs for shared_ptr,特别是在具有返回指向实现的指针的工厂类的继承层次结构的情况下.

以上内容对于具有大量内部库的大型应用程序非常有用.对于这种情况,上述的改进将是将公共标题放入lib/include/lib.这样你的图书馆的客户就必须包括lib/....可以将其视为标题的命名空间.

祝好运!

  • 啊! 所以你有一个Fwd.h文件!每个标题不是一个!现在我看到这有多大意义......好吧,我会思考一下...... (2认同)