I have three classes:
A data holder class CDataHolder, which uses a Pimpl pattern
class CDataHolder { public: // ... private: friend class CBase; struct PImpl; PImpl* iPimpl; };
A base class CBase, which need to access the iPImpl member in CDataHolder, so it is a friend class of CDataHolder
class CBase: { protected: CDataHolder::Pimpl* getDataHolderPimpl(); };
A derived class CDerived from CBase, which need to access the same iPimpl member also. Here occurs a problem. The derived class cannot use the iPimpl member although its parent class is a friend class. like this:
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" } };
There are plenty of derived classes, so it's not a good way for each derived class to put a "friend class CDerivedXXX" line in CDataHolder class. How to overcome this issue? Is there a better way to do this? Thanks in advance.