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++ Qt中实现异步散列器的代码示例

    在C++ Qt中实现异步散列器的代码示例

    在很多工作中,我们需要计算数据或者文件的散列值,例如登录或下载文件,而在 Qt 中,负责这项工作的类为 QCryptographicHash,本文给大家介绍了在C++ Qt中实现异步散列器的代码示例,需要的朋友可以参考下
    2024-09-09
  • C语言中strcpy和strcat的使用和模拟实现

    C语言中strcpy和strcat的使用和模拟实现

    strcpy() 函数是 C语言中一个非常重要的字符串处理函数,其功能是将一个字符串复制到另一个字符串中,strcat函数可以将一个字符串拼接到另一个字符串的末尾,本文给大家介绍了C语言中strcpy和strcat的使用和模拟实现,需要的朋友可以参考下
    2024-03-03
  • QT使用共享内存实现进程间通讯

    QT使用共享内存实现进程间通讯

    这篇文章主要为大家详细介绍了QT如何使用共享内存实现进程间通讯,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-12-12
  • C语言中函数指针与软件设计经验总结

    C语言中函数指针与软件设计经验总结

    今天小编就为大家分享一篇关于C语言中函数指针与软件设计经验总结,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • C语言实现电话簿管理系统

    C语言实现电话簿管理系统

    这篇文章主要为大家详细介绍了C语言实现电话簿管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • java string对象上的操作,常见的用法你知道吗

    java string对象上的操作,常见的用法你知道吗

    今天给大家带来的是关于Java的相关知识,文章围绕着Java String类用法展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-08-08
  • OpenCV和C++实现图像的翻转(镜像)、平移、旋转、仿射与透视变换

    OpenCV和C++实现图像的翻转(镜像)、平移、旋转、仿射与透视变换

    这篇文章主要给大家介绍了关于OpenCV和C++实现图像的翻转(镜像)、平移、旋转、仿射与透视变换的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-09-09
  • C语言栈与队列相互实现详解

    C语言栈与队列相互实现详解

    栈和队列,严格意义上来说,也属于线性表,因为它们也都用于存储逻辑关系为 "一对一" 的数据,但由于它们比较特殊,本章讲解分别用队列实现栈与用栈实现队列
    2022-04-04
  • C/C++中线程基本概念与创建详解

    C/C++中线程基本概念与创建详解

    线程是在进程中产生的一个执行单元,是CPU调度和分配的最小单元,其在同一个进程中与其他线程并行运行,他们可以共享进程内的资源。本文就和大家一起聊聊线程基本概念以及如何创建多线程,需要的可以参考一下
    2022-09-09
  • C++中md5 算法实现代码

    C++中md5 算法实现代码

    在网上找了份c++ MD5的代码,就简单保存一下,需要的朋友可以参考下
    2017-07-07

最新评论