c++ - 前向声明包括,在声明之上包括(ClassFwd.h + Class.h)

标签 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()
{
}

我的问题:

大家怎么看?如果这是一个好习惯?

注意我最感兴趣的是这种做法的论据,看看我是否遗漏了一些让我同意斯科特迈耶斯的东西。

最佳答案

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

lib/
  include/
    class headers + Fwd.h
src/
  source files + internal headers

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

要放在前向声明 header 中的另一件事是 shared_ptrtypedef,尤其是在具有返回指向实现的指针的工厂类的继承层次结构的情况下。

以上对于具有大量内部库的大型应用程序很有用。对于这种情况,上述内容的改进是将公共(public) header 放在 lib/include/lib 中。这样,您的库的客户端就必须包含 lib/...。将其视为 header 的命名空间。

祝你好运!

关于c++ - 前向声明包括,在声明之上包括(ClassFwd.h + Class.h),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3935183/

相关文章:

c++ - 为什么一次打印一个字符比预先连接它们慢?

c++ - 使用泰勒方法 C++ 和循环计算 Pi

c++ - 线程安全数据和线程安全容器

c++ - MiniMax 到 Alpha-Beta 搜索转换的问题

包含外部库时 C++ 多重定义错误

c++ - 无法在 std::map 成员变量中分配具有前向声明值的类

c++ - 在 C++ 中转发声明一个隐藏的 typedef

macos - xcode 4 上的语义警告

php - 我在这些 php 脚本中做错了什么?

class - 我如何在 Puppet 中执行类