0

维基百科在关于不透明指针的文章中声称,

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

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

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

我的问题的重点是,当在 cpp 实现文件中完全声明和定义嵌套类的方法时,它的可见性如何?它的析构函数会按预期调用吗(包含类将在其析构函数中对其调用 delete)?

_编辑_ 固定版本,http ://en.wikipedia.org/wiki/Opaque_pointer

4

2 回答 2

4

PIMPL 是一个令人作呕的习语,我得出的结论是它更像是一种反模式。

但是,如果您坚持使用它,您可以在实现文件中将析构函数简单地定义为空,以充分利用您希望使用的任何智能指针来自动破坏非 POD 实现。

class Impl;
class Object {
    std::unique_ptr<Impl> impl;
public:
    //...
    ~Object();
};

#include "Impl.h"
// in cpp
Object::~Object() {}

这个快速的代码示例清楚地将 Wikipedia 定义为完全错误的 - 在实现文件中简单地定义析构函数以使用您想要的任何析构函数,甚至是需要完整定义的智能指针,都是完全可能的。

于 2011-08-23T11:56:22.960 回答
3

是的,这是完全错误的。PIMPL 结构的析构函数必须在它被调用的地方可见,这是从类本身的析构函数的定义来看的。将两个析构函数放在同一个 .cpp 文件中,首先是 PIMPL dtor,可见性得到保证。

PIMPL dtor 没有理由在其他任何时候都可见,因为它没有在那里被调用。

于 2011-08-23T11:59:42.403 回答