C++ pimpl设计模式

C++设计模式—pimpl模式

1.pimpl设计模式—Pointer to implementation
2.code_1
//MyClass.h

class MyClass{
	public:
    	void	func1();
    	void	func2();
    
    private:			//private中表示我们不想暴露出去的函数或字段
    	void	func3();
    	void	func4();
    
    	int a;
    	int b;
}
  • code_1的缺点:
    • 在某些情况下,需要暴露MyClass.h头文件,那么其中的private成员是不是也不得已的暴露出去了呢?
    • 此时用户就有可能通过查看这些private成员猜到代码的架构或实现,这是不安全的
    • 解决方法就是本文的pimpl模式
3.code_2
// MyClass.h

class MyClass{
    public:				// public部分和之前是一样的
    	void	func1();
    	void	func2();
    
    private:			// 使用impl类包含所有希望隐藏的private数据
    	class impl;
    	impl* pimpl;	// 访问方式是通过指向class impl的指针完成.
}

// MyClass.cpp
MyClass::MyClass(){
	//在构造函数中实例化impl类
    pimpl = new impl;
}

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

// 下面是class impl的定义,同样在MyClass.cpp中
class MyClass::impl(){
	public:
    	void func1();
    	void func2();
    private:
    	void func3();
    	void func4();
    
    	int a;
    	int b;
}
void MyClass::impl::func1(){
    ....
}
void MyClass::impl::func2(){
    ....
}
.......
  • pimpl模式就是将类的private私有属性隐藏进一个内部类,如本例中的class impl
  • 同时设置一个内部类的指针去访问该内部类
  • 需要将impl定义在MyClass.cpp文件中,这样一来,因为用户只能看到MyClass 类的成员和方法,看不到Class impl的具体情况,此时就将MyClass的私有属性给隐藏了起来
  • MyClass的所有功能都由内部类 impl调用完成

4.pimpl模式的优点:
  • 非常适合于隐藏private实现:也即需要将MyClass的头文件MyClass.h暴露给用户,但是此时不可避免的会把MyClass.h中的private函数或字段也暴漏给用户;因此通过定义内部类impl的方式,将private实现隐藏进一个类中,并且将这个内部类的定义和实现都放在MyClass.h的.cpp文件中。因为.cpp文件对于用户来说不可见,所以也就保护了MyClass 类中的Private成员

  • pimpl模式被称为编译防火墙:可以减少编译时间

    • 通常,如果头文件中的某些内容发生改变,意味着所有引用该头文件的代码都需要重新编译,即使变更的是无法被用户类使用的私有成员
    • 在pimpl模式下,通过要改变的代码都存在于源文件中,头文件没有发生变化,这样更改代码后就不会花费过多的编译时间

请添加图片描述


5.reference

①[PImpl - cppreference.com]
②[介绍一个C++中非常有用的设计模式 (qq.com)]:程序喵大佬的推文

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咖啡与乌龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值