在C 编程中,PImpl(Pointer to Implementation)是一种常见的设计模式,也被称为“编译器化”的编程技巧。这个模式背后的核心思想是将类的实现细节封装在一个单独的类中,从而降低类的耦合性,提高代码的可维护性和可扩展性。
定义
PImpl技术是一种实现封装的编程技巧,使用PImpl时需要两个类:接口类和实现类。接口类负责定义接口,供外部调用,实现类实现具体功能;接口类内不存在实现细节,实现细节存在于实现类内;接口类内含实现类的指针,接口类方法通过持有指针调用实现类内的方法;从而将类的接口和实现分离开来。由于接口类内存有指向实现的指针,故称之为PImpl(Pointer to Implementation,指向实现的指针)模式
使用实例
结合如上的定义,可书写如下的代码示例,
代码语言:javascript复制//头文件,此文件会提供给代码用户
// MyClass.h
#include <memory>
class MyClassImpl; // 实现类前向声明
//接口类
class MyClass {
public:
MyClass();
~MyClass();
void doSomething();
private:
std::unique_ptr<MyClassImpl> pimpl;
};
//接口类的源文件
// MyClass.cpp
#include "MyClass.h"
//实现类,为演示方便写在了同一个文件内,
//建议公众中将实现类写在单独文件内
class MyClassImpl {
public:
void doSomething() {
// 实现细节
}
};
MyClass::MyClass() : pimpl(std::make_unique<MyClassImpl>()) {}
MyClass::~MyClass() = default;
void MyClass::doSomething() {
pimpl->doSomething();
}
在上面的示例中,MyClass 类将其实现细节封装在 MyClassImpl 类中。MyClassImpl 类的定义被放在了 MyClass.cpp 文件中,这样可以避免暴露类的实现细节给客户端代码。而 MyClass 类只保留了一个指向 MyClassImpl 实现类的指针,通过这种方式将类的接口和实现分离开来。
PImpl的优点
- 降低了类的耦合性:通过将类的实现细节封装在一个单独的实现类中,可以减少类之间的依赖关系,从而降低了类的耦合性。
- 提高了代码的可维护性和可扩展性:由于类的接口和实现分离开来,可以更容易地修改和扩展类的实现细节,而不会影响到类的用户。
- 隐藏了类的实现细节:PImpl技术可以将类的实现细节隐藏起来,只向外部暴露必要的接口,从而提高了代码的安全性和可理解性。
实际项目中的应用
PImpl技术在实际项目中有着广泛的应用,特别是在开发大型和复杂的软件系统时。它可以帮助我们更好地组织和管理代码,提高代码的可维护性和可扩展性。例如在开发商用的C 库时,希望尽可能少的暴露信息给用户,PImpl大有用武之地。
学废了,点个赞吧,