0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C++中非常有用的设计模式

汽车电子技术 来源:程序喵大人 作者:程序喵大人 2023-02-21 14:21 次阅读

大家好,今天介绍一个C++中非常常用的模式:pimpl

至于它有什么作用,直接看代码:

// MyClass.h


class MyClass {
public:
    void func1();
    void func2();


private:
    void func3();
    void func4();


    int a;
    int b;
};

假设我们在开发一个SDK,或者设计某个模块,需要暴露出去一个MyClass.h头文件,并向用户提供func1和func2两个功能。

但是MyClass中还有一些private函数和字段,这些函数和字段我们本意可能是不想被用户知道,因为可能里面有些隐私内容,用户有可能通过这些private方法和字段就能猜到我们的架构及实现。

这也是我们平时设计模块需要注意的一点:只暴露出该暴露的东西。

那怎么做呢?答案就是pimpl模式。

可以这样:

// MyClass.h


class MyClass {
public:
    void func1();


    void func2();


private:
    class impl;
    impl* pimpl;
};


// MyClass.cc
class MyClass::impl {
public:
    void func1();
    void func2();


private:
    void func3();
    void func4();


    int a;
    int b;
};


MyClass::MyClass() {
    pimpl = new impl;
}


void MyClass::func1() {
    pimpl->func1();
}

将类的private属性隐藏进一个内部类,然后通过一个指针访问(提前声明)它的接口。在头文件中只暴露出应该暴露的功能,然后持有一个Impl的指针,而Impl则具体在MyClass.cc中定义,用户什么都看不到。然后所有的功能都通过Impl完成。头文件里的Impl的指针也可以通过智能指针(unique_ptr)来代替,但这不是本文的重点。

再总结一下pimpl模式的优点:

  • 非常适合隐藏private实现:如果想要在头文件中暴露public接口,但又不想暴露private实现的细节,则可以使用pimpl模式来隐藏细节。
  • pimpl模式也被称为编译防火墙,是一种用来减少编译时间的方法。通常来讲,如果头文件里的某些内容变更了,意味着所有引用该头文件的代码都要被重新编译,即使变更的是无法被用户类访问的私有成员。将这部分代码从被引用多次的头文件里移除到只被引用编译一次的源文件中,更改此文件就不会付出太长的编译时间。

大家怎么看?

参考资料

https://en.cppreference.com/w/cpp/language/pimpl

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C++
    C++
    +关注

    关注

    21

    文章

    2104

    浏览量

    73463
  • SDK
    SDK
    +关注

    关注

    3

    文章

    1024

    浏览量

    45736
  • 头文件
    +关注

    关注

    0

    文章

    25

    浏览量

    9843
  • func
    +关注

    关注

    0

    文章

    2

    浏览量

    1029
收藏 人收藏

    评论

    相关推荐

    开发板里的CPLD原程序,一般厂商是不提供的,内部资料,非常有用

    本帖最后由 assingle 于 2011-2-18 14:03 编辑 开发板里的CPLD内部逻辑原理,一般厂商是不提供的,内部资料,非常有用,希望能给大家有参考作用,开发环境QUARTUS II 6.0,CPLD为EPM240T100C5N,超便宜,比EPM712
    发表于 02-18 14:02

    对新手非常有用的电子器件基础资料

    本帖最后由 eehome 于 2013-1-5 09:56 编辑 对新手非常有用的电子器件基础资料PCB打样找华强 http://www.hqpcb.com/3 样板2天出货
    发表于 10-20 20:13

    03国赛控制类准备步骤,非常有用

    这是关于国赛准备的一些模块原理图以及相关PCB布线等的步骤,非常有用
    发表于 01-23 22:00

    MPLAB Harmony C++怎么使用

    MPLAB和谐文档(在什么是MPLAB和谐?)“MPLA-和声没有用C++测试过,因此,没有提供对这个编程语言的支持。”——对于2018来说非常令人难以置信。有人成功地使用C++和和声
    发表于 09-20 09:40

    请问有没有用C++开发STM32的

    我大学学的C++,相对C语言来说更喜欢C++语言,只是不知道有没有用C++开发STM32程序的,不是指仅仅玩玩,而是有没
    发表于 10-26 08:42

    CodeWarrior C and C++ and Assembly 语言参考设计

    本文是英文版的,介绍了CodeWarrior C and C++ and Assembly 语言参考设计,在您的设计中或许有用
    发表于 06-22 15:33 74次下载

    大话设计模式C++

    让大家全方位傻瓜式学习大话设计模式C++
    发表于 07-13 15:11 7次下载

    Vim中默认未启用但实际非常有用的选项

    Vim 作为一款功能强大、选项丰富的编辑器,为许多用户所热爱。本文介绍了一些在 Vim 中默认未启用但实际非常有用的选项。虽然可以在每个 Vim 会话中单独启用,但为了创建一个开箱即用的高效编辑环境,还是建议在 Vim 的配置文件中配置这些命令。
    的头像 发表于 09-25 17:54 5383次阅读

    C++语言的基本构成详细资料说明

    C++语言中的数据类型、运算、语句结构、数组、指针、函数是C++程序设计的基础。掌握这些基本内容,对利用C++语言解决一般应用问题是非常必要和有用
    发表于 02-19 14:49 0次下载
    <b class='flag-5'>C++</b>语言的基本构成详细资料说明

    C++常见设计模式解析与实现

    C++常见设计模式解析与实现说明。
    发表于 06-01 15:44 11次下载

    CC++混合编程是什么

    这篇文章讲解的知识点很“小”,但是在CC++的混合编程中非常重要。因为我们在写应用程序时,经常利用到第三方的程序。如果我们的代码用C,但是第三方代码是
    的头像 发表于 02-14 13:48 1601次阅读
    <b class='flag-5'>C</b>与<b class='flag-5'>C++</b>混合编程是什么

    17个非常有用的Python技巧

    Python 是一门非常优美的语言,其简洁易用令人不得不感概人生苦短。在本文中,作者 Gautham Santhosh 带我们回顾了 17 个非常有用的 Python 技巧,例如查找、分割和合并列表等。这 17 个技巧都非常简单
    的头像 发表于 04-10 14:28 515次阅读

    一个简单但非常有用的小前置放大器电路

    一个简单但非常有用的小前置放大器电路可以通过连接几个晶体管来构建。该装置可轻松将 1mV 信号提升至 100mV 甚至更高。因此,它非常方便放大不能直接与功率放大器一起使用的极小信号。
    的头像 发表于 06-10 17:27 1534次阅读
    一个简单但<b class='flag-5'>非常有用</b>的小前置放大器电路

    没有什么是完美的,但FPGA可能非常有用

    FPGA是非常有用的器件,通常与ADI公司的ADC或功率IC等一起设计到客户的设计中。FPGA 可以实现微控制器和所需的任何胶水逻辑。在这篇博客中,我将讨论一些与功能安全和FPGA相关的问题。
    的头像 发表于 06-29 10:28 1399次阅读
    没有什么是完美的,但FPGA可能<b class='flag-5'>非常有用</b>

    c++多行注释快捷键

    C++中,多行注释(也称为块注释)是一种用于注释大段代码或多个语句的方法。当你希望暂时禁用一些代码或者解释特定部分代码的作用时,多行注释是非常有用的。 在C++中,多行注释以 /* 开始,以
    的头像 发表于 11-22 10:24 8047次阅读