通过PIMPL习语设计调用构造函数

时间:2013-07-29 08:15:21

标签: c++ pimpl-idiom

/*Process.h*/
class Process  {
    public:
    Process(ProcessID thirdParty_pid);

    protected:
    void createImpl();

    private:
    ProcessImpl  * _impl;
};


/*ProcessImpl.h*/

 class ProcessImpl {
      public :
      ProcessImpl(ProcessID thirdParty_pid);
 }

现在使用PIMPL惯用法我试图以这种方式调用ProcessImpl构造函数:

Process::Process(ldframework::ProcessID tpid):_impl(ldframework::ProcessImpl::ProcessImpl(tpid)) {
}

但我收到了以下错误 错误:无法在初始化

中将ProcessImpl转换为ProcessImpl *

请帮助解决此错误,并让我知道正确的metrhod调用

3 个答案:

答案 0 :(得分:1)

由于_impl是指针,因此必须使用指针初始化它:

Process::Process(ldframework::ProcessID tpid)
    : _impl(new ldframework::ProcessImpl::ProcessImpl(tpid))
{ ... }

请注意new初始化中使用_impl关键字。

答案 1 :(得分:1)

_impl是指针(PIMPL =>指向实施的指针)

因此,请使用new关键字进行初始化。

Process::Process(ldframework::ProcessID tpid)
  :_impl( new ldframework::ProcessImpl::ProcessImpl(tpid)) {
}

但是将PIMPL用于smart_pointers,因此请阅读Sutter about compilation firewalls

答案 2 :(得分:0)

您的表达式ldframework::ProcessImpl::ProcessImpl(tpid)评估为键入ProcessImpl,这与您的成员ProcessImpl*的类型_impl不同。

尝试在初始化列表中使用new,并在析构函数中记住delete

e.g。

: _impl( new ldframework::ProcessImpl::ProcessImpl(tpid) )

以及稍后的析构函数

delete _impl;