pimpl成语的impl类有析构函数吗?

时间:2017-06-07 02:00:05

标签: c++11 effective-c++

我在有效的现代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
{
};

2 个答案:

答案 0 :(得分:0)

PIMPL idiom的实现接口结构不能声明为类的private字段。此外,在C ++中不允许声明unique_ptr到不完整的数据类型,因此我们必须选择普通的旧指针来声明PIMPL,并适当地手动newdelete。 / p>

struct Impl的析构函数可以在widget.cpp中这样定义:

Widget::Impl::~Impl()
{

};

最终代码可能如下所示:

widget.h

class Widget
{
public:
    Widget();
    ~Widget();
    struct Impl;
private:
    Impl* pImpl;
};

widget.cpp

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() {
 }