c++ - 为什么要使用 "PIMPL"成语?

标签 c++ oop information-hiding pimpl-idiom

背景:

PIMPL Idiom (指向 IPLementation 的指针)是一种实现隐藏技术,其中公共(public)类包装了在公共(public)类所属的库之外无法看到的结构或类。

这对库的用户隐藏了内部实现细节和数据。

在实现这个习惯用法时,为什么要将公共(public)方法放在 pimpl 类而不是公共(public)类上,因为公共(public)类的方法实现将被编译到库中,而用户只有头文件?

为了说明,这段代码将 Purr() 实现放在了 impl 类上,并将其包装起来。

为什么不在公共(public)类上直接实现 Purr?

// header file:
class Cat {
    private:
        class CatImpl;  // Not defined here
        CatImpl *cat_;  // Handle

    public:
        Cat();            // Constructor
        ~Cat();           // Destructor
        // Other operations...
        Purr();
};


// CPP file:
#include "cat.h"

class Cat::CatImpl {
    Purr();
...     // The actual implementation can be anything
};

Cat::Cat() {
    cat_ = new CatImpl;
}

Cat::~Cat() {
    delete cat_;
}

Cat::Purr(){ cat_->Purr(); }
CatImpl::Purr(){
   printf("purrrrrr");
}

最佳答案

我认为大多数人将此称为 Handle Body 成语。参见 James Coplien 的书 Advanced C++ Programming Styles and Idioms 。它也被称为 Cheshire Cat因为Lewis Caroll's角色逐渐消失,直到只剩下笑容。

示例代码应分布在两组源文件中。那么只有 Cat.h 是产品附带的文件。

CatImpl.h 包含在 Cat.cpp 中,CatImpl.cpp 包含 CatImpl::Purr() 的实现。使用您的产品的公众不会看到此信息。

基本上,这个想法是尽可能地隐藏实现以防窥探。

这在您拥有作为一系列库提供的商业产品时最有用,这些库通过 API 进行访问,客户的代码是针对该 API 进行编译和链接的。

我们通过重写 IONA's 来做到这一点Orbix 2000年3.3产品。

正如其他人所提到的,使用他的技术将实现与对象的接口(interface)完全分离。然后,如果您只想更改 Purr() 的实现,则不必重新编译使用 Cat 的所有内容。

这种技术用于一种称为 design by contract 的方法中。 .

关于c++ - 为什么要使用 "PIMPL"成语?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60570/

相关文章:

c++ - boost::iterator_adapter 不适用于 STL 算法

c++ - 这些数组类型有何不同?

c++ - 无向图上顶点和边的变化

c++ - 为什么 range::iota_view 的构造函数不将参数移动到成员变量?

c++ - 在抽象基类定义中使用未知类型

c++ - 如何从存储在字符串中的类型创建实例

php - 在 PHP 中从具有动态类名的类中获取静态属性

c++ - 对类的用户隐藏模板类使用的#include

c - 有什么办法可以在 C 中制作 "protected"typedef 吗?

c - 这种情况下如何实现信息隐藏呢?