是否有可能实现以下目标:
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(使用前将#替换为@)