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