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)]:程序喵大佬的推文

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐