C++中Pimpl的惯用法详解

 更新时间:2023年09月07日 10:48:45   作者:繁星意未平  
Pimpl(Pointer to Implementation)是一种常见的 C++ 设计模式,用于隐藏类的实现细节,本文将通过一个较为复杂的例子,展示如何使用智能指针来实现 Pimpl 惯用法,需要的可以参考下

介绍

Pimpl(Pointer to Implementation)是一种常见的 C++ 设计模式,用于隐藏类的实现细节,从而减少编译依赖和提高编译速度。本文将通过一个较为复杂的例子,展示如何使用智能指针(如 std::unique_ptr)来实现 Pimpl 惯用法。

什么是 Pimpl 惯用法

Pimpl 是 “Pointer to Implementation” 的缩写,这个模式可以帮助我们:

  • 将接口和实现分离
  • 减少头文件中的依赖
  • 加速编译

基本实现

基本的 Pimpl 实现需要一个前置声明的内部类和一个指向该内部类的指针。在这里,我们使用 std::unique_ptr 来管理这个内部类的实例。

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();
}

示例

假设我们有一个 Car 类,它有多个组件,如 Engine 和 Wheel。

Car.h

#include <memory>
class CarImpl;
class Car {
public:
    Car();
    ~Car();
    void Start();
    void Stop();
private:
    std::unique_ptr<CarImpl> pimpl;
};

Car.cpp

#include "Car.h"
#include "Engine.h"
#include "Wheel.h"
class CarImpl {
public:
    Engine engine;
    Wheel wheel[4];
    void Start() {
        engine.Start();
        // 其他逻辑
    }
    void Stop() {
        engine.Stop();
        // 其他逻辑
    }
};
Car::Car() : pimpl(std::make_unique<CarImpl>()) {}
Car::~Car() = default;
void Car::Start() {
    pimpl->Start();
}
void Car::Stop() {
    pimpl->Stop();
}

在这个例子中,Car 的用户只需要包含 Car.h,而不需要知道 Engine 和 Wheel 的存在。这样就降低了编译依赖并提高了编译速度。

总结

通过使用 Pimpl 惯用法和智能指针,我们能更有效地隐藏实现细节,提高编译速度,并使代码更易于维护。

到此这篇关于C++中Pimpl的惯用法详解的文章就介绍到这了,更多相关C++ Pimpl内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ stack与queue使用方法详细讲解

    C++ stack与queue使用方法详细讲解

    stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行 元素的插入与提取操作;队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素
    2023-01-01
  • C语言/C++中如何产生随机数

    C语言/C++中如何产生随机数

    这里要用到的是rand()函数, srand()函数,和time()函数。需要说明的是,iostream头文件中就有srand函数的定义,不需要再额外引入stdlib.h;而使用time()函数需要引入ctime头文件
    2013-10-10
  • 麻将游戏算法深入解析及实现代码

    麻将游戏算法深入解析及实现代码

    这篇文章主要介绍了麻将游戏算法深入解析及实现代码的相关资料,需要的朋友可以参考下
    2017-03-03
  • 从汇编看c++中多态的应用

    从汇编看c++中多态的应用

    本篇文章是对c++中多态的应用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 深入讲解C++数据类型转换的相关函数的知识

    深入讲解C++数据类型转换的相关函数的知识

    这篇文章主要介绍了深入讲解C++数据类型转换的相关函数的知识,包括类型转换运算符函数等内容,需要的朋友可以参考下
    2015-09-09
  • 基于C语言航班信息查询与检索

    基于C语言航班信息查询与检索

    这篇文章主要为大家详细介绍了基于C语言航班信息查询与检索,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • C语言详解关键字sizeof与unsigned及signed的用法

    C语言详解关键字sizeof与unsigned及signed的用法

    这篇文章主要为大家详细介绍了C语言关键字sizeof&&unsigned&&signed,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • C++关于const与引用的分析讲解

    C++关于const与引用的分析讲解

    Const 是C++中常用的类型修饰符,常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的,引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量
    2022-04-04
  • C语言系统日期和时间实例详解

    C语言系统日期和时间实例详解

    我们在写C语言程序的时候,有的时候会用到读取本机的时间和日期,下面这篇文章主要给大家介绍了关于C语言系统日期和时间的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • C语言菜鸟基础教程之单精度浮点数与双精度浮点数

    C语言菜鸟基础教程之单精度浮点数与双精度浮点数

    在C语言中,单精度浮点数(float)和双精度浮点数(double)类型都是用来储存实数的,双精度是用记忆较多,有效数字较多,数值范围较大。
    2017-10-10

最新评论