如何从另一个派生类访问数据类的私有成员变量,该派生类的父类是数据类的友元类?

时间:2009-05-12 03:40:04

标签: c++ friend derived private-members

我有三个班级:

  1. 数据持有者类CDataHolder,它使用Pimpl模式

    class CDataHolder
    {
    public:
      // ...
    private:
    friend class CBase;
    struct PImpl;
    PImpl* iPimpl;
    };
    
  2. 基类CBase,需要访问CDataHolder中的iPImpl成员,因此它是CDataHolder的朋友类

    class CBase: 
    {
    protected:
    CDataHolder::Pimpl* getDataHolderPimpl();
    };
    
  3. 从CBase获取的派生类,需要访问同一个iPimpl成员。这里出现了问题。 派生类不能使用iPimpl成员,尽管其父类是友元类。像这样:

    class CDerived : public CBase
    {
    public:
    void doSth() {
       CDataHolder::Pimpl *pImpl = getDataHolderPimpl(); // this line raises an error: 
                                                         // "illegal access from CDataHolder to protected/private member CDataHolder::PImpl"
    }
    };
    

    有很多派生类,因此对于每个派生类来说,在CDataHolder类中放置“友元类CDerivedXXX”行并不是一个好方法。 如何克服这个问题?有一个更好的方法吗?提前致谢。

2 个答案:

答案 0 :(得分:2)

由于您已在CDataHolder类的私有部分声明了struct PImpl,因此只有CDataHolder的朋友可以访问相同的内容。为什么不在公共部分提出前瞻性声明struct PImpl,或者在CDataHolder课程之前更好?

答案 1 :(得分:1)

朋友(理所当然)非常有限,无法继承。我讨厌提出这个问题,但也许A)你需要公开访问PImpl或它的某些方面,或者B)你需要DataHolder类为你做PImpl的事情。