كيفية ربط فئتين من القوالب في صداقة كثير إلى كثير؟

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

سؤال

افترض أن لدي فئتي القالب التاليتين:

template <class _A>
class First
{
private:
    int a;
};

template <class _B>
class Second
{
private:
    int b;
};

كيف يمكنني ربطهم في صداقة كثير لكثير.على سبيل المثال، إضافة أسلوب في First يطبع b لكائن معلمة Second.

هل سؤالي واضح؟

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

المحلول

template <typename T>
class First {
   int a;
   template<typename> friend class Second;
};
template <typename T>
class Second
{
   int b;
   template<typename> friend class First;
};

وهذا سيمكن كل First<T> للوصول إلى الأجزاء الداخلية لكل Second<U>.الآن، على الرغم من أن هذا هو الحل التقني، فقد ترغب في التفكير فيما إذا كان التصميم ذو التبعيات الدورية وفتح الجزء الداخلي لأي إنشاء مثيل للفئة الأخرى هو الحل الأفضل لمشكلتك الخاصة.

راجع للشغل، إذا كنت ترغب فقط في منح First<int> الولوج إلى Second<int> (و لا Second<double>) يمكنك القيام بذلك على النحو التالي:

template <typename> class Second;
template <typename T>
class First {
   int a;
   friend class Second<T>; // only befriend the same instantiation
};
template <typename T>
class Second {
   int b;
   friend class First<T>;
};

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

نصائح أخرى

بافتراض أنك تفهم الحماية ، فإن مشكلة الإعلان عن النماذج: Genacodicetagpre

يمكنك البدء بإعلان كل فئة: Genacodicetagpre

والآن سيعرف كلا الصفين عن الآخر في تعريفاتهما.يمكنك إعلانهم كأصدقاء هناك إذا احتجت إلى ذلك. Genacodicetagpre

والشيء نفسه في الاتجاه المعاكس.

يمكنك أيضًا تنفيذ الهيئات الوظيفية ضمن تعريفات الفئات إذا كانوا بحاجة إلى رؤية تفاصيل بعضهم البعض ، أي لا يمكنهم استخدام نسخة "إقرار إعادة توجيه".

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