《Effective Mocern C++》item 22: Pimpl Idiom
PIMPL(Private Implementation 或 Pointer to Implementation)是通过一个私有的成员指针,将指针所指向的类的内部实现数据进行隐藏。
PIMPL基于这样一个事实:在C++类中,允许定义一个成员指针,指向一个已声明过的类型。在头文件中只是存放该类型的声明,而具体的定义是存放在CPP文件中,这样就可以隐藏类型的具体实现。
该chapter与讲解unique_ptr的chapter息息相关: https://blog.****.net/qq_35865125/article/details/103752348
---------------comment: 对于incomplete type,可以用来声明指针或者引用,不能使用其进行实例化。
---用std::unique_ptr来代替裸指针:
--上面这样使用std::unique_ptr可能会出现的编译错误: 上面的代码没有为Widget类实现析构函数,因此编译器会自动
生成一个默认的析构函数,析构函数会调用widget类的各个成员变量的析构函数,当调用成员std::unique_ptr<Impl>的
析构函数时报错了,该成员的析构函数就是unique_ptr类的析构函数,其会对其包裹的指针进行delete, 下文中提到,在delete
之前c++会对将要被delete的指针进行检查,看其是否是不完整类型,于是乎,就是在这一步出错了。我认为可能是编译器自动
生成的析构函数在头文件里面,看不到Impl结构的定义,所以报错,下下文提到的解决办法也是用户去自己在cpp中显示地定义析构函数::
解决编译错误:
ongoing------
Ref:
https://blog.****.net/wo17fang/article/details/25280577
https://www.cnblogs.com/cthon/p/9196258.html
https://blog.****.net/lxgwm2008/article/details/13511783