继承期间用于受保护成员的pimpl

时间:2018-07-19 10:07:51

标签: c++ oop inheritance protected pimpl-idiom

我在基类hpp文件中声明了许多受受保护的成员函数,这些文件由派生的类使用。我的想法是从头文件中删除它们以减少编译依赖性。我还考虑对受保护成员也使用pimpl方法。

我在 Base 类cpp文件中定义了一个 Impl 类,并将所有受 protected 功能移到 Impl 内类。此外,我对 Base 类头文件中的 Impl 类做了一个前向声明,作为受保护的成员。

protected:
    class Impl;
    Impl* impl_;

但是这样做时,当我使用派生的类中的 impl _ 调用受保护的函数时,派生类编译中发生了以下错误:

error: invalid use of incomplete type ‘class Base::Impl’
    if (false == impl_->EncodeMMMsgHeader(mm_msg_header_)) {
error: forward declaration of ‘class Base::Impl’

我认为会发生错误是因为在任何情况下编译器都需要有关该类的上下文信息时,不能使用前向声明,也不能告诉编译器只告诉该类一点点信息。< / p>

有什么办法可以克服上述问题?如果没有,那么有人可以建议我一种更好的方法来实现自己的目标。

1 个答案:

答案 0 :(得分:1)

您可以添加一层以减少依赖性:

来自

#include "lot_of_dependencies"

#include <memory>

class MyClass
{
public:
    ~MyClass();
    /*...*/
protected:
    /* Protected stuff */
private:
    struct Pimpl;
    std::unique_ptr<Pimpl> impl;
};

添加

MyClassProtectedStuff.h

#include "lot_of_dependencies"

class MyClassProtectedStuff
{
public:
    /* Protected stuff of MyClass */
private:
    // MyClass* owner; // Possibly back pointer
};

然后

MyClass.h

#include <memory>

class MyClassProtectedStuff;

class MyClass
{
public:
    ~MyClass();
    /*...*/
protected:
    const MyClassProtectedStuff& GetProtected() const;
    MyClassProtectedStuff& GetProtected();
private:
    struct Pimpl;
    std::unique_ptr<Pimpl> impl;
    std::unique_ptr<MyClassProtectedStuff> protectedData; // Might be in Piml.
};

然后派生类应同时包含两个标头,而常规类仅应包含MyClass.h