维基百科在article on opaque pointers声称
d指针是该类的唯一私有数据成员,并指向结构的实例(由于其析构函数不可见,因此必须是POD)
这在PIMPL中不是必需的,只是维基百科通常是特殊的,不是吗?
我缺乏d-pointer标签作为我的问题的答案,但希望有人可能贡献维基百科和/或澄清事情。或者只是说维基百科很糟糕,最后等等:)
我的问题是,在cpp实现文件中完全声明和定义时,嵌套类的方法有多明显?它的析构函数是否会按预期调用(包含类将在其析构函数中调用delete)?
答案 0 :(得分:4)
PIMPL是一种恶心的习惯,我得出的结论是它更像是一种反模式。
但是,如果您坚持使用它,您可以在实现文件中将析构函数简单地定义为空,以充分利用您需要使用的任何智能指针来自动销毁非POD实现。
class Impl;
class Object {
std::unique_ptr<Impl> impl;
public:
//...
~Object();
};
#include "Impl.h"
// in cpp
Object::~Object() {}
这个快速代码示例清楚地将维基百科定义为完全错误 - 只需在实现文件中定义析构函数即可使用您想要的任何析构函数,甚至是需要完整定义的智能指针。
答案 1 :(得分:3)
没有理由让PIMPL dtor在任何其他位置可见,因为它不会在那里被调用。