私は3つのクラスを持っています:
Pimpl パターンを使用するデータ ホルダー クラス CDataHolder
クラス CDataHolder { 公衆: // ... プライベート: フレンド クラス CBase; 構造体 PImpl; PImpl* iPimpl; };
CDataHolder の iPImpl メンバーにアクセスする必要がある基本クラス CBase で、CDataHolder のフレンド クラスです。
クラス CBase: { 保護: CDataHolder::Pimpl* getDataHolderPimpl(); };
同じ iPimpl メンバーにもアクセスする必要がある、CBase から派生した派生クラス CD。ここで問題が発生します。派生クラスは、親クラスがフレンド クラスですが、iPimpl メンバーを使用できません。このような:
クラス CDerived : public CBase { 公衆: ボイドdoSth() { CDataHolder::Pimpl *pImpl = getDataHolderPimpl(); // この行でエラーが発生します: // 「CDataHolder からプロテクト/プライベート メンバー CDataHolder::PImpl への不正アクセス」 } };
派生クラスはたくさんあるので、派生クラスごとに「friend class CDerivedXXX」という行を CDataHolder クラスに入れるのは得策ではありません。この問題を克服するにはどうすればよいですか?これを行うより良い方法はありますか?前もって感謝します。