كيفية الوصول إلى متغير العضو الخاص بفئة البيانات من فئة مشتقة أخرى تكون فئتها الأصلية فئة صديقة لفئة البيانات؟

StackOverflow https://stackoverflow.com/questions/851041

سؤال

لدي ثلاث فئات:

  1. فئة حامل البيانات CDataHolder، والتي تستخدم نمط Pimpl

    class CDataHolder
    {
    public:
      // ...
    private:
    friend class CBase;
    struct PImpl;
    PImpl* iPimpl;
    };
    
  2. فئة أساسية CBase، والتي تحتاج إلى الوصول إلى عضو iPImpl في CDataHolder، لذا فهي فئة صديق لـ CDataHolder

    class CBase: 
    {
    protected:
    CDataHolder::Pimpl* getDataHolderPimpl();
    };
    
  3. فئة مشتقة من 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 نيابة عنك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top