我有三个班级:
使用 Pimpl 模式的数据持有者类 CDataHolder
类 CDataHolder { 上市: // ... 私人的: 朋友类 CBase; 结构 PImpl; PImpl* iPimpl; };
一个基类CBase,需要访问CDataHolder中的iPImpl成员,所以是CDataHolder的友元类
CBase 类: { 受保护: CDataHolder::Pimpl* getDataHolderPimpl(); };
CBase 的派生类 CDerived,它也需要访问相同的 iPimpl 成员。这里出现问题。尽管其父类是友元类,但派生类不能使用 iPimpl 成员。像这样:
CDrived 类:公共 CBase { 上市: 无效doSth(){ CDataHolder::Pimpl *pImpl = getDataHolderPimpl(); // 此行引发错误: // "从 CDataHolder 非法访问受保护/私有成员 CDataHolder::PImpl" } };
有很多派生类,所以每个派生类在 CDataHolder 类中放置“朋友类 CDerivedXXX”行并不是一个好方法。如何克服这个问题?有一个更好的方法吗?提前致谢。