代码之家  ›  专栏  ›  技术社区  ›  afuzzyllama user7757658

为什么要将类放在实现文件中?

  •  20
  • afuzzyllama user7757658  · 技术社区  · 12 年前

    在查看一些代码时,我遇到了以下问题:

    .h文件

    class ExampleClass
    {
    public:
        // methods, etc
    private:
        class AnotherExampleClass* ptrToClass;
    }
    

    .cpp文件

    class AnotherExampleClass
    {
        // methods, etc
    }
    
    // AnotherExampleClass and ExampleClass implemented 
    

    在c++中工作时,这是一种模式还是有益的?由于类没有分解到另一个文件中,所以这个工作流是否会加快编译时间?

    还是这就是这个开发者的风格?

    3 回复  |  直到 12 年前
        1
  •  25
  •   bgporter    12 年前

    这被称为 pImpl Idiom 、柴郡猫技术或编译防火墙。

    优点:

    • 更改类的私有成员变量不需要重新编译依赖于它的类,因此使时间更快,并且 减少了脆弱二进制接口问题。
    • 头文件不需要#include私有成员变量中“by value”使用的类,因此编译时间更快。
    • 这有点像SmallTalk自动处理类的方式。。。更纯的封装。

    缺点:

    • 实施者需要更多的工作。
    • 不适用于需要子类访问的“受保护”成员。
    • 由于某些信息已不在头文件中,所以代码更难读取。
    • 由于指针间接性,运行时性能略有下降,特别是如果函数调用是虚拟的(间接分支的分支预测通常很差)。

    赫伯·萨特(Herb Sutter)的《超凡C++》(Exception C++)一书也详细介绍了这种技术的适当用法。

        2
  •  11
  •   Ulrich Eckhardt    12 年前

    最常见的例子是使用PIMPL模式或类似技术时。不过,还有其他用途。通常,C++中的.hpp/.cpp是(或者至少可以是)公共接口与私有实现之间的区别。如果一个类型仅作为实现的一部分使用,那么这是不在头文件中导出它的好理由。

        3
  •  7
  •   cmaster - reinstate monica    12 年前

    除了可能是PIMPL习惯用法的实现之外,还有两个可能的原因:

    C++中的对象无法修改 this 指针。因此,它们不能在使用过程中更改类型。然而 ptrToClass 可以更改,允许实现 delete 并用另一个子类的另一实例替换自身 AnotherExampleClass .

    如果 另一个示例类 取决于一些模板参数,但 ExampleClass 不,可以使用从 另一个示例类 以提供实施。这会向接口类的用户隐藏部分必要的内部类型信息。

    推荐文章