我在有效的现代cpp中学习pimpl,经过一些搜索,没有人谈论pimpl成语的impl类的析构函数工具,是不是没必要?
//in widget.h
#include <memory>
class Widget{
public:
Widget();
private:
struct Impl;
std::unique_ptr<Impl> pImpl;
};
//in widget.cpp
........
struct Widget::Impl{
std::string name; // Widget::Impl
std::vector<double> data;
};
struct Widget::~Impl() //error!!!,how can we implement it
{
};
答案 0 :(得分:0)
PIMPL idiom的实现接口结构不能声明为类的private
字段。此外,在C ++中不允许声明unique_ptr
到不完整的数据类型,因此我们必须选择普通的旧指针来声明PIMPL,并适当地手动new
和delete
。 / p>
struct Impl
的析构函数可以在widget.cpp
中这样定义:
Widget::Impl::~Impl()
{
};
最终代码可能如下所示:
class Widget
{
public:
Widget();
~Widget();
struct Impl;
private:
Impl* pImpl;
};
struct Widget::Impl
{
Impl();
std::string name; // Widget::Impl
std::vector<double> data;
~Impl();
};
//Widget Impl Constructor
Widget::Impl::Impl()
{
}
//Widget Impl Destructor
Widget::Impl::~Impl()
{
};
//Widget Constructor
Widget::Widget() : pImpl(nullptr)
{
pImpl = new Impl();
}
//Widget Destructor
Widget::~Widget()
{
delete pImpl;
pImpl = nullptr;
}
答案 1 :(得分:0)
感谢@Retired Ninja的demo代码帖子,它有很多帮助,重点是,我们需要在cpp文件中声明~Impl:
Widget::Widget():pImpl(std::make_unique<Impl>())
{
}
struct Widget::Impl {
std::string name;
std::vector<double> data;
~Impl();// need this !!
};
Widget::Impl::~Impl(){
};
Widget::~Widget() {
}