سؤال

نظرا لأن الصداقة الفئة غير موروثة في C ++، فما أفضل طريقة "وهمية"؟

كنت أفكر في تعريض واجهة Friend Class الخاصة من خلال الأساليب المحمية في الفئة الأساسية التي تم إنشاؤها، ولكن هذا يؤدي إلى الكتابة (والصيانة) نفس الواجهة مرتين.

هل هناك اي طرق اخرى؟

هل كانت مفيدة؟

المحلول

استخدام أ مفتاح هو الحل المحتمل.

الفكرة هي أنه يمكنك فتح العمليات فقط إذا كان لديك مفتاح... ولكن مثال يستحق الآلاف على الكلمة لذلك دعونا الغوص:

// Step 1: The key
class NeedAccess;

namespace details { class Key { friend NeedAccess; Key() {} }; }

// Step 2: NeedAccess
class NeedAccess
{
protected:
  static details::Key GetKey() { return details::Key(); }
};

// Step 3: The big one
class BigOne
{
public:
  void lockedMethod(details::Key);
};

إن مسألة مفتاح كونها نسخة قابلة للبناء هي قيد المناقشة. لا أرى ما يمكنك الحصول عليه عن طريق منع ذلك.

فائدة أخرى هي أنه يمكنك الحصول على العديد من المفاتيح، اعتمادا على الطريقة التي تريد الوصول إليها، وبهذه الطريقة التي تمنحها الصداقة "الجزئية"، ولا يمكن لأصدقائك "الجزئي" الفوضى عن قطعتك الخاصة، على الرغم من المطالبة الشهيرة!

تعديل:

وتسمى هذه الطريقة من الصداقة المحدودة، ونوقشت comp.lang.c ++. inderated.

الميزة الرئيسية لهذه الطريقة بالمقارنة مع واجهة خاصة, ، هو اقتران فضفاض، لأن الإعلانات الأمامية فقط ضرورية.

نصائح أخرى

يحتاج الأطفال من الفصل مع Frinedship إلى طرح أحد الوالدين للقيام بالوصول إليهم.

class CrustyNeighbour
{
    private:
       friend class Bob;
       void useWiFi(std::string const& data);
};

class Bob
{
    protected:
        useWifi(CrustyNeighbour& neighbour,std::string const& data)
        {  neighbour.useWiFi(data);}
};

class Mary: public Bob // Bob's offspring
{
     void playHalo(WifiOwner& owner) // WifiOwner derived from CrustyNeighbour
     {
         useWifi(owner,gameData);  // use wifi via his/her parent who access to eighbours wifi
     }
};

لست متأكدا مما إذا كان هذا ليس ما تفكر فيه بالفعل ولكن إليك صديق افتراضي مثال

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