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

StackOverflow https://stackoverflow.com/questions/851041

我有三门课:

  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 派生的 CDerived 类,也需要访问相同的 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 类中放置“friend class CDerivedXXX”行并不是一个好方法。如何克服这个问题?有一个更好的方法吗?提前致谢。

有帮助吗?

解决方案

既然你已经声明了 struct PImpl 在 CDataHolder 类的私有部分中,只有 CDataHolder 的朋友才能访问它。你为什么不提出一个前瞻性声明 struct PImpl 在公共部分或者在 CDataHolder 类之前更好?

其他提示

朋友(理所当然)非常有限并且不能继承。我讨厌提出这个问题,但也许 A) 您需要公共访问 PImpl 或其某些方面,或者 B) 您需要 DataHolder 类为您使用 PImpl 做一些事情。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top