PIMPL,POD,实现类的可见性,它的析构函数会被调用吗?

时间:2011-08-23 11:24:29

标签: c++ visibility destructor pimpl-idiom

维基百科在article on opaque pointers声称

  

d指针是该类的唯一私有数据成员,并指向结构的实例(由于其析构函数不可见,因此必须是POD)

这在PIMPL中不是必需的,只是维基百科通常是特殊的,不是吗?

我缺乏d-pointer标签作为我的问题的答案,但希望有人可能贡献维基百科和/或澄清事情。或者只是说维基百科很糟糕,最后等等:)

我的问题是,在cpp实现文件中完全声明和定义时,嵌套类的方法有多明显?它的析构函数是否会按预期调用(包含类将在其析构函数中调用delete)?

_ 修改 _ 修正版http://en.wikipedia.org/wiki/Opaque_pointer

2 个答案:

答案 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结构的析构函数必须在它被调用的位置可见,这来自类本身的析构函数的定义。将两个析构函数放在同一个.cpp文件中,首先是PIMPL dtor,并确保可见性。

没有理由让PIMPL dtor在任何其他位置可见,因为它不会在那里被调用。