gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 11:33:46 28 4
gpt4 key购买 nike

背景:

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com