كيفية ربط فئتين من القوالب في صداقة كثير إلى كثير؟
-
27-10-2019 - |
سؤال
افترض أن لدي فئتي القالب التاليتين:
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
والشيء نفسه في الاتجاه المعاكس.
يمكنك أيضًا تنفيذ الهيئات الوظيفية ضمن تعريفات الفئات إذا كانوا بحاجة إلى رؤية تفاصيل بعضهم البعض ، أي لا يمكنهم استخدام نسخة "إقرار إعادة توجيه".