如何将 pimpl-idiom 实例从 child 传递到 parent?

How to pass a pimpl-idiom instance from child to parent?

我有一个 parent class 和一个 child class 有一个 Pimpl class 实现。 我想在 child class 中创建一个 pimpl 的实例,并通过 child 的构造函数将其传递给 parent 到 [=32= 的构造函数].

我尝试创建一个 parent 的构造函数,它将 impl class 作为参数,然后从 child.

的构造函数调用这个构造函数
//ParentInterface.h

class impl; //  error message is here after I add the constructor with parameter

class ParentInterface {
public:

    ParentInterface();

    ParentInterface(impl *pimpl);

    virtual ~ParentInterface();
    ParentInterface(const ParentInterface& orig);


private:
    class impl;
    impl* pimpl;

};


//ParentInterface.cpp

class ParentInterface::impl
{
  public:
    virtual ~impl(){}
    MLB_API temp[1];

  private:
};

ParentInterface::ParentInterface():pimpl(new impl()){

}

ParentInterface::ParentInterface(impl *pimpl_){
     pimpl = pimpl_;
}

ParentInterface::~ParentInterface() {
    delete pimpl;
    pimpl = NULL;
}

每当我添加采用 impl class 的构造函数时,第一行 class impl; 就会出错。以下几行是错误信息

changes meaning of ‘impl’ from ‘struct impl’

Unable to resolve forward declaration impl

编译器错误是由 2 个不同的 class impl 引起的:一个在全局范围内,另一个在 ParentInterface 中。 ParentInterface 构造函数接受全局 class impl,而 ParentInterface::pimplclass ParentInterface::impl.

类型

要修复编译器错误,请删除全局 class impl:

class ParentInterface {
protected: // Accessible to derived classes.
    class impl;
    impl* pimpl;

public:
    ParentInterface();
    ParentInterface(impl *pimpl);
    ~ParentInterface();
};

class ParentInterface::impl
{
public:
    virtual ~impl() {}
};

ParentInterface::ParentInterface()
    : pimpl(new impl)
{}