使用指针隐藏实现(Pimpl 惯用语)

2024-05-08

是否有可能实现以下目标:

x.hpp- 该文件被许多其他类包含

class x_impl; //forward declare
class x {
    public:
        //methods...
    private:
        x_impl* impl_;
};

x.cpp- 实施

#include <conrete_x>
typedef concrete_x x_impl;    //obviously this doesn't work
//implementation of methods...

所以基本上,我希望用户包含该文件x.hpp,但不知道具体_x.hpp header.

既然我可以使用concrete_x仅通过指针并且它仅作为私有数据成员出现,前向声明应该足以让编译器知道为其准备多少空间。它看起来很像著名的“pimpl idiom”。

你能帮我解决这个问题吗?

附言。我不想使用void*并把它扔到周围..


实际上,甚至可以完全对用户隐藏:

// Foo.hpp
class Foo {
public:

    //...

private:
    struct Impl;
    Impl* _impl;
};

// Foo.cpp
struct Foo::Impl {
    // stuff
};

我只是想提醒您:

  • 你需要编写一个正确的析构函数
  • 因此,您还需要一个适当的复制构造函数、复制赋值运算符、移动构造函数和移动赋值运算符

有一些方法可以实现 PIMPL 的自动化,但代价是一些黑魔法(类似于std::shared_ptr does).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用指针隐藏实现(Pimpl 惯用语) 的相关文章

随机推荐