查看原文
其他

介绍一个C++中非常有用的设计模式

程序喵大人 程序喵大人 2022-08-22

大家好,今天介绍一个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.ccclass 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



往期推荐



研究了一下Android JNI,有几个知识点不太懂。

60 张图详解 98 个常见网络概念

哪家互联网公司一周工作时间最长??太卷了!!!

没办法,基因决定的!

C++的lambda是函数还是对象?

深入理解glibc malloc:内存分配器实现原理

到底什么是挂载?

C/C++为什么要专门设计个do…while?

为什么空类大小是1

推荐一个学习技术的好网站

在部队当程序员有多爽?

Linux最大并发数是多少?

累够呛!整理了一份C++学习路线图!

C++ protected继承和private继承是不是没用的废物?

图解|工作6年多,我还是没有搞懂什么是协程的道与术

研究了一波Android Native C++内存泄漏的调试

参加了 40 多场面试。

如何调试内存泄漏?方法论来了

写了一段“高端”C语言代码


点个在看你最好看



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存