我想在继承中使用pimpl惯用语。

这是基本的公共(public)类及其实现类:

class A
{
    public:
      A(){pAImpl = new AImpl;};
      void foo(){pAImpl->foo();};
    private:
      AImpl* pAImpl;
};
class AImpl
{
    public:
      void foo(){/*do something*/};
};

我希望能够使用其实现类创建派生的公共(public)类:
class B : public A
{
    public:
      void bar(){pAImpl->bar();};    // Can't do! pAimpl is A's private.
};

class BImpl : public AImpl
{
    public:
      void bar(){/*do something else*/};
};

但是我不能在B中使用pAimpl,因为它是A的私有(private)数据。

因此,我看到了一些解决方法:
  • 在B中创建BImpl * pBImpl成员,并将其与其他A构造函数A(AImpl *)传递给A。
  • 将pAImpl更改为 protected (或添加Get函数),并在B中使用它。
  • B不应从A继承。在B中创建BImpl * pBImpl成员,并在B中创建foo()和bar(),这将使用pBImpl。
  • 还有其他方法吗?

  • 我应该选择什么?

    最佳答案

    class A
    {
        public:
          A(bool DoNew = true){
            if(DoNew)
              pAImpl = new AImpl;
          };
          void foo(){pAImpl->foo();};
        protected:
          void SetpAImpl(AImpl* pImpl) {pAImpl = pImpl;};
        private:
          AImpl* pAImpl;
    };
    class AImpl
    {
        public:
          void foo(){/*do something*/};
    };
    
    class B : public A
    {
        public:
          B() : A(false){
              pBImpl = new BImpl;
              SetpAImpl(pBImpl);
          };
          void bar(){pBImpl->bar();};
        private:
          BImpl* pBImpl;
    };
    
    class BImpl : public AImpl
    {
        public:
          void bar(){/*do something else*/};
    };
    

    07-24 14:04