如何将子代惯用法实例从子代传递给父代?

时间:2019-09-17 15:10:54

标签: c++ c++98 pimpl-idiom

我有一个具有Pimpl类实现的父类和子类。 我想在子类中创建pimpl的实例,并通过子类的构造函数将其传递给父类。

我尝试创建一个以impl类作为参数的父级构造函数,然后从子级构造函数调用此构造函数。

//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 impl;都会出问题。以下行是错误消息

changes meaning of ‘impl’ from ‘struct impl’

Unable to resolve forward declaration impl

1 个答案:

答案 0 :(得分:1)

编译器错误是由两个不同的class impl引起的:一个在全局范围内,另一个在ParentInterface中。 ParentInterface构造函数接受全局class impl,而ParentInterface::pimpl的类型为class 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)
{}
相关问题