どのようにアクセスデータのクラスのプライベートメンバー変数から導出クラスの親クラスの友達のクラスのデータ。
-
21-08-2019 - |
質問
いつクラス
データホルダークラスCDataHolderを使用するPimplパターン
class CDataHolder { public: // ... private: friend class CBase; struct PImpl; PImpl* iPimpl; };
基底クラスCBase、アクセスする必要iPImpl員CDataHolderいそうですね、本当に神経質になクラスのCDataHolder
class CBase: { protected: CDataHolder::Pimpl* getDataHolderPimpl(); };
導出クラスCDerivedから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" } };
たくさんあり、導出クラスでない方のための各派生クラスに入る"友達のクラスCDerivedXXX線のCDataHolderクラスです。どのようこの問題を克服するための?あると良い。よろしくお願いします。
解決
あなたはCDataHolderクラスのプライベートな部分で
struct PImpl
を宣言しておりますので、、CDataHolderの唯一の友人が同じにアクセスすることができます。なぜあなたはCDataHolderクラスの前に前方宣言のパブリックセクションでstruct PImpl
またはより良いを入れないのですか?
他のヒント
フレンドは(当然)非常に限られており、継承することはできません。私は質問を頼むことを憎むが、多分どちらかA)あなたは公衆PIMPLへのアクセスまたはその一部側面、またはBを必要とする)あなたはあなたのためにPIMPLで何かをするDataHolderクラスを必要とします。
所属していません StackOverflow