背景
对于类的设计与定义,我们习惯上使用“指向实现的指针”, 或者叫PImpl。例如下面的类:
// widget.h(接口)
class widget {
// 公开成员
private:
struct impl; // 实现类的前置声明
impl* ptr;
};
// widget.cpp(实现)
struct widget::impl {
// 实现细节
};
1、对于impl类的改动,不会影响到widget类相应编绎单元的重新编绎,从编绎角度能够较大提供编绎效率。
2、有利于构建稳定的ABI接口。即是某个库使用了impl,则更新了impl的实现之后,新版本库能够兼容旧的ABI。
问题
正常代码
为了对比下面智能指针代码,这里给出一个正常使用raw pointer的示例代码
//widget.h
struct Impl;
class