至于它有什么作用,直接看代码:
// 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++
+关注
关注
21文章
2071浏览量
73052 -
SDK
+关注
关注
3文章
984浏览量
45093 -
头文件
+关注
关注
0文章
23浏览量
9809 -
func
+关注
关注
0文章
2浏览量
1021
发布评论请先 登录
相关推荐
开发板里的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
MPLAB Harmony C++怎么使用
MPLAB和谐文档(在什么是MPLAB和谐?)“MPLA-和声没有用C++测试过,因此,没有提供对这个编程语言的支持。”——对于2018来说非常令人难以置信。有人成功地使用C++和和声
发表于 09-20 09:40
CodeWarrior C and C++ and Assembly 语言参考设计
本文是英文版的,介绍了CodeWarrior C and C++ and Assembly 语言参考设计,在您的设计中或许有用:
发表于 06-22 15:33
•74次下载
Vim中默认未启用但实际非常有用的选项
Vim 作为一款功能强大、选项丰富的编辑器,为许多用户所热爱。本文介绍了一些在 Vim 中默认未启用但实际非常有用的选项。虽然可以在每个 Vim 会话中单独启用,但为了创建一个开箱即用的高效编辑环境,还是建议在 Vim 的配置文件中配置这些命令。
C++语言的基本构成详细资料说明
C++语言中的数据类型、运算、语句结构、数组、指针、函数是C++程序设计的基础。掌握这些基本内容,对利用C++语言解决一般应用问题是非常必要和有用
发表于 02-19 14:49
•0次下载
![<b class='flag-5'>C++</b>语言的基本构成详细资料说明](https://file.elecfans.com/web1/M00/85/96/pIYBAFxrsqqAfJS6AAIsd69DPeM278.png)
17个非常有用的Python技巧
Python 是一门非常优美的语言,其简洁易用令人不得不感概人生苦短。在本文中,作者 Gautham Santhosh 带我们回顾了 17 个非常有用的 Python 技巧,例如查找、分割和合并列表等。这 17 个技巧都非常简单
一个简单但非常有用的小前置放大器电路
一个简单但非常有用的小前置放大器电路可以通过连接几个晶体管来构建。该装置可轻松将 1mV 信号提升至 100mV 甚至更高。因此,它非常方便放大不能直接与功率放大器一起使用的极小信号。
![一个简单但<b class='flag-5'>非常有用</b>的小前置放大器电路](https://file.elecfans.com/web2/M00/A9/85/poYBAGR7B2SAUanjAALZd2jFiRk971.png)
没有什么是完美的,但FPGA可能非常有用
FPGA是非常有用的器件,通常与ADI公司的ADC或功率IC等一起设计到客户的设计中。FPGA 可以实现微控制器和所需的任何胶水逻辑。在这篇博客中,我将讨论一些与功能安全和FPGA相关的问题。
![没有什么是完美的,但FPGA可能<b class='flag-5'>非常有用</b>](https://file1.elecfans.com/web2/M00/8B/A9/wKgZomSc8l6AUvHPAAHwtC75vHM867.png)
c++多行注释快捷键
在C++中,多行注释(也称为块注释)是一种用于注释大段代码或多个语句的方法。当你希望暂时禁用一些代码或者解释特定部分代码的作用时,多行注释是非常有用的。 在C++中,多行注释以 /* 开始,以
评论