我有三个班级:
数据持有者类CDataHolder,它使用Pimpl模式
class CDataHolder { public: // ... private: friend class CBase; struct PImpl; PImpl* iPimpl; };
基类CBase,需要访问CDataHolder中的iPImpl成员,因此它是CDataHolder的朋友类
class CBase: { protected: CDataHolder::Pimpl* getDataHolderPimpl(); };
从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”行并不是一个好方法。 如何克服这个问题?有一个更好的方法吗?提前致谢。
答案 0 :(得分:2)
由于您已在CDataHolder类的私有部分声明了struct PImpl
,因此只有CDataHolder的朋友可以访问相同的内容。为什么不在公共部分提出前瞻性声明struct PImpl
,或者在CDataHolder课程之前更好?
答案 1 :(得分:1)
朋友(理所当然)非常有限,无法继承。我讨厌提出这个问题,但也许A)你需要公开访问PImpl或它的某些方面,或者B)你需要DataHolder类为你做PImpl的事情。