كيفية الوصول إلى متغير العضو الخاص بفئة البيانات من فئة مشتقة أخرى تكون فئتها الأصلية فئة صديقة لفئة البيانات؟
-
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(); };
فئة مشتقة من 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.كيفية التغلب على هذه المشكلة؟هل هناك طريقة أفضل للقيام بذلك؟شكرا لك مقدما.
المحلول
منذ أن أعلنت struct PImpl
في الجزء الخاص من فئة CDataHolder، يمكن لأصدقاء CDataHolder فقط الوصول إليه.لماذا لا تضع إعلانا إلى الأمام struct PImpl
في القسم العام أو حتى أفضل قبل فئة CDataHolder؟
نصائح أخرى
الصديق (بحق) محدود للغاية ولا يمكن توريثه.أكره أن أطرح هذا السؤال، ولكن ربما أ) تحتاج إلى الوصول العام إلى PImpl أو بعض جوانبه، أو ب) تحتاج إلى فئة DataHolder للقيام بشيء ما مع PImpl نيابة عنك.