《Effective Mocern C++》item 22: Pimpl Idiom

 

PIMPL(Private Implementation 或 Pointer to Implementation)是通过一个私有的成员指针,将指针所指向的类的内部实现数据进行隐藏。

PIMPL基于这样一个事实:在C++类中,允许定义一个成员指针,指向一个已声明过的类型。在头文件中只是存放该类型的声明,而具体的定义是存放在CPP文件中,这样就可以隐藏类型的具体实现。

 


该chapter与讲解unique_ptr的chapter息息相关: https://blog.csdn.net/qq_35865125/article/details/103752348

《Effective Mocern C++》item 22: Pimpl Idiom

《Effective Mocern C++》item 22: Pimpl Idiom 

《Effective Mocern C++》item 22: Pimpl Idiom

---------------comment: 对于incomplete type,可以用来声明指针或者引用,不能使用其进行实例化。

《Effective Mocern C++》item 22: Pimpl Idiom

---用std::unique_ptr来代替裸指针:

《Effective Mocern C++》item 22: Pimpl Idiom

《Effective Mocern C++》item 22: Pimpl Idiom

--上面这样使用std::unique_ptr可能会出现的编译错误: 上面的代码没有为Widget类实现析构函数,因此编译器会自动

生成一个默认的析构函数,析构函数会调用widget类的各个成员变量的析构函数,当调用成员std::unique_ptr<Impl>的

析构函数时报错了,该成员的析构函数就是unique_ptr类的析构函数,其会对其包裹的指针进行delete, 下文中提到,在delete

之前c++会对将要被delete的指针进行检查,看其是否是不完整类型,于是乎,就是在这一步出错了。我认为可能是编译器自动

生成的析构函数在头文件里面,看不到Impl结构的定义,所以报错,下下文提到的解决办法也是用户去自己在cpp中显示地定义析构函数::

《Effective Mocern C++》item 22: Pimpl Idiom

《Effective Mocern C++》item 22: Pimpl Idiom

解决编译错误:

《Effective Mocern C++》item 22: Pimpl Idiom

《Effective Mocern C++》item 22: Pimpl Idiom

ongoing------

 

 


Ref:

https://blog.csdn.net/wo17fang/article/details/25280577

https://www.cnblogs.com/cthon/p/9196258.html

https://blog.csdn.net/lxgwm2008/article/details/13511783

《Effective Mocern C++》item 22: Pimpl Idiom