C++ 中的 Pimpl 惯用法

这篇具有很好参考价值的文章主要介绍了C++ 中的 Pimpl 惯用法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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 类,它有多个组件,如 EngineWheel

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,而不需要知道 EngineWheel 的存在。这样就降低了编译依赖并提高了编译速度。

总结

通过使用 Pimpl 惯用法和智能指针,我们能更有效地隐藏实现细节,提高编译速度,并使代码更易于维护。文章来源地址https://www.toymoban.com/news/detail-692556.html

到了这里,关于C++ 中的 Pimpl 惯用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Vue2 Element 表格&表单 我惯用的写法

    Vue2 Element 表格&表单 我惯用的写法

    我需要整理一下表单验证和表格, 我们的项目里大量的使用了它们, 我应该形成一个模式去套用而不是像现在这样边构思边写. 还好后端返回的数据通常规范好用, 不是一些奇形怪状的结构. 表头创建, 最少需要知道表头要写的字( label )和该表头下该列出何种数据, 大部分时候这

    2023年04月15日
    浏览(11)
  • 【C++】C++中的继承

    【C++】C++中的继承

    继承 机制是面向对象程序设计 使代码可以复用 的最重要的手段,它允许程序原在 保持原有类特性的基础上进行扩展 ,增加功能,这样产生新的类,称为 派生类 。继承 呈现了面向对象程序设计的层次结构 ,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复

    2024年02月03日
    浏览(9)
  • 【C++】C++中的list

    【C++】C++中的list

           官方给的  list 的文档介绍 简单来说就是:         list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个

    2024年04月17日
    浏览(6)
  • C++笔记:C++中的重载

    C++笔记:C++中的重载

    代码演示例子: 然后如果 output(NULL) 那行代码没有注释掉,那么就会出现,注释说明的情况,无法匹配造成歧义: 对于成员函数重载和普通函数的重载一样,我就不用代码进行演示了。 不能重载的运算符: 类外: 参考代码: 练习:         实现下面的代码: 参考代码:

    2024年04月25日
    浏览(9)
  • 【c++】深入学习c++中的模板

    【c++】深入学习c++中的模板

        文章目录 前言 一、非类型模板参数 二、模板的特化 1.引入概念 2.模板的分离编译 总结   我们在前几篇的学习中只是使用了最简单的模板,比如用一个模板类等等,我们这篇的学习将在以前的基础上再深入的学习一下模板。   模板参数分类类型形参与非类型形参 。 类

    2023年04月09日
    浏览(8)
  • C++好难(8):C++中的继承

    C++好难(8):C++中的继承

    目录 1.继承的概念及定义 🍉继承的概念 🍉 继承的定义: 🍒格式定义:  🍒继承关系和访问限定符 🍒继承基类成员访问方式的变化 2.基类和派生类对象赋值转换 3.继承中的作用域: 4.派生类的默认成员函数 5.继承与友元 6.继承与静态成员  7.复杂的菱形继承记菱形虚拟继

    2024年02月13日
    浏览(9)
  • C++核心编程:C++中的引用

    C++核心编程:C++中的引用

    作用:给变量起别名 语法: 数据类型 别名 = 原名 引用必须初始化 引用在初始化后,就不可以改变了 示例: 作用 :函数传参时,可以利用引用的技术让形参修饰实参 优点 :可以简化指针修改实参 示例: 作用:引用时可以作为函数的返回值存在的。 注意: 不要返回局部变量

    2024年02月13日
    浏览(11)
  • C++中的内存空间管理详解【C++】

    C++中的内存空间管理详解【C++】

    如图代码中变量在内存中的存储位置。 内存分布图: 1. 栈又叫做堆栈,存储非静态局部变量/函数参数/返回值等等,栈是向下增长的。 栈是向下增长的,而堆是向上增长的? 一般来说,在栈上开辟空间,先开辟的空间地址较高,而在堆开辟空间,先开辟的空间地址较低。

    2024年02月07日
    浏览(9)
  • C++零基础教程(C++中的打印)

    本篇文章我们来学习如何在C++中打印数据,在C语言中我们会使用hello world来打印数据,那么在C++中是如何实现数据的打印呢? 在C++中,数据打印通常使用标准输出流(std::cout)进行。std::cout是C++标准库中的一个输出流对象,可以将数据输出到控制台或其他设备。下面是一些常

    2024年02月15日
    浏览(7)
  • [开发语言][python][c++]:C++中的this指针和Python中的Self -- 26岁生日

    以朋友的新岁祝福开篇,祝笔者也祝大家☺️: 之前一直对 C++ 中的 this 和 python 中的 self 到底是什么关系,为什么 C++ 要显式的写出来,python 则不需要? 模糊不清,趁着周末整理一下相关结论,希望本篇文章可以解答这些问题,同时对C++和Python中的类加深些理解。 python 当

    2024年01月24日
    浏览(17)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包