دالة الصديق Friend Function/ وفئة الصديق Friend class
في لغة (C++)، friend function أو friend class هي ميزة تسمح لدالة أو فئة بالوصول إلى الأعضاء الخاصين والمحميين في فئة أخرى. تعمل هذه الميزة على كسر التغليف إلى حد ما، ولكنها قد تكون مفيدة في سيناريوهات محددة حيث يكون الاقتران المحكم بين الفئات ضروريًا أو عند تنفيذ أنماط تصميم معينة.
Friend Function:
دالة الصديق هي دالة عادية تُمنح حق الوصول إلى أعضاء خاصين ومحميين في الفئة. لإعلان دالة كصديق لفئة ما، يجب عليك الإعلان عنها ضمن إعلان الفئة المسبوق بالكلمة الأساسية "friend".
مثال 1:
#include <iostream> using namespace std; class myClass { int a, b; public: myClass(int i, int j) { a = i; b = j; } friend int sum(myClass ob); }; int sum(myClass ob) { return ob.a + ob.b; } int main() { myClass o(10, 20); cout << sum(o) << endl; return 0; }
في مقتطف كود C++ هذا، يتم تعريف فئة تسمى myClass مع عضوين صحيحين خاصين a وb. يحتوي الـclass أيضًا على مُنشئ لتهيئة هؤلاء الأعضاء. بالإضافة إلى ذلك، هناك مجموع دالة friend معلنة داخل الـclass.
تأخذ الدالة sum كائنًا من النوع myClass كوسيطة لها وترجع مجموع الأعضاء الخاصين a وb لهذا الكائن.
في الوظيفة الرئيسية، يوجد كائن o من النوع myClass بقيم أولية 10 و20، ثم يتم استدعاء دالة المجموع لتمرير هذا الكائن o كوسيطة. وأخيرًا، إخراج نتيجة دالة المجموع باستخدام cout.
فيما يلي تفاصيل تنفيذ التعليمات البرمجية:
- يتم إنشاء كائن o من النوع myClass بالقيمتين 10 و20.
- يتم استدعاء الدالة sum باستخدام الكائن o كوسيطة.
- داخل الدالة sum، يتم الوصول إلى العضوين الخاصين a وb للكائن ob من خلال إعلان friend، ويتم إرجاع مجموعهما.
- ثم تتم طباعة sum باستخدام cout.
لذلك، عند تشغيل هذا البرنامج، تكون المخرجات:
30
مثال 2:
#include <iostream> using namespace std; class CRectangle { private: int width, height; friend CRectangle duplicate(CRectangle); public: void set_values(int, int); int area(void) { return (width * height); } }; void CRectangle::set_values(int a, int b) { width = a; height = b; } CRectangle duplicate(CRectangle R) { CRectangle T; T.width = R.width * 2; T.height = R.height * 2; return T; } int main() { CRectangle rect, rectb; rect.set_values(2, 3); cout << "The area before duplicate = " << rect.area() << endl; rectb = duplicate(rect); cout << "The area after duplicate = " << rectb.area() << endl; return 0; }
يحدد كود C++ هذا فئة CRectangle تمثل مستطيلاً. يحتوي الكلاس على عرض وارتفاع أعضاء البيانات الخاصة، ودالتين عضويتين هما set_values وarea.
في القسم private، العرض والارتفاع هما أبعاد المستطيل. يتم استخدام الدالة set_values لتعيين قيم العرض والارتفاع. تقوم دالة المساحة بحساب مساحة المستطيل وإرجاعها.
تم الإعلان عن الدالة المكررة كصديق لـ CRectangle. وهذا يعني أن لديه إمكانية الوصول إلى أعضاء CRectangle الخاصين.
تقوم الدالة set_values بتعيين عرض المستطيل وارتفاعه بناءً على المعلمات المتوفرة.
تأخذ الدالة المكررة كائن CRectangle كمعلمة، وتنشئ كائن CRectangle جديد T، وتعين عرض وارتفاع T ليكون ضعف عرض وارتفاع الإدخال R. ثم يقوم بإرجاع المستطيل الجديد T.
في الدالة الرئيسة:
- يتم إنشاء كائنات rect وrectb لـCRectangle.
- يتم استدعاء الدالة set_values في rect لتعيين أبعادها على 2×3.
- سيتم طباعة مساحة rect قبل مضاعفتها.
- يتم استدعاء الدالة المكررة باستخدام rect كوسيطة، ويتم تعيين المستطيل الذي تم إرجاعه إلى rectb.
- تتم طباعة rectb بعد مضاعفتها.
مخرجات هذا البرنامج تكون كالتالي:
The area before duplicate = 6 The area after duplicate = 24
مثال 3:
#include <iostream> using namespace std; class Tri; class CRectangle { int width, height; public: void set_values(int a, int b) { width = a; height = b; } friend int Sum(Tri T, CRectangle R); }; class Tri { int W, H; public: Tri(int a, int b) { W = a; H = b; } friend int Sum(Tri T, CRectangle R); }; int Sum(Tri T, CRectangle R) { return T.W + R.width; } int main() { CRectangle r; r.set_values(2, 3); Tri l(5, 10); cout << Sum(l, r) << endl; return 0; }
يوضح برنامج C++ هذا استخدام دوال friend عبر فئات مختلفة. إليك تفاصيل الكود:
إعلان الكلاس:
- تم الإعلان عن فئتين: CRectangle وTri.
- يحتوي CRectangle على عضوين خاصين بالعرض والارتفاع، ووظيفة العضو set_values لتعيين هذه القيم.
- يحتوي Tri على عضوين خاصين من البيانات W وH، ومُنشئ لتهيئتهما.
الإعلان عن دالة Friend:
- يعلن كلا الفئتين عن وظيفة صديق تسمى Sum. هذا يعني أن الدالة Sum يمكنها الوصول إلى الأعضاء الخاصين في كل من CRectangle وTri.
تنفيذ دالة Friend:
- تأخذ الدالة Sum كائنات من النوعين Tri وCRectangle كوسائط وتقوم بإرجاع مجموع أعضائها الخاصين.
- في هذه الحالة، تقوم بإرجاع مجموع W من الكائن Tri والعرض من الكائن CRectangle.
الدالة الرئيسة main:
- في الدالة الرئيسية، يتم إنشاء كائن r من النوع CRectangle ويتم استدعاء دالة set_values الخاصة به لتعيين أبعاده إلى 2×3.
- تم إنشاء كائن آخر l من النوع Tri بأبعاد 5×10.
- يتم استدعاء الدالة Sum باستخدام الكائنين l وr كوسائط، ويتم طباعة النتيجة.
المخرجات:
- نظرًا لأن الدالة Sum تُرجع مجموع W من Tri والعرض من CRectangle، فسيكون الناتج 5 + 2 = 7.
Friend Class:
فئة Friend هي فئة يتم منحها حق الوصول إلى الأعضاء الخاصين والمحميين في فئة أخرى. يمكنك الإعلان عن فئة Friend من خلال سبق الإعلان عنها بالكلمة الأساسية "Friend" داخل الفئة التي تعتبر صديقًا لها.
مثال 4:
#include <iostream> using namespace std; class CSquare; class CRectangle { int width, height; public: int area(void) { return (width * height); } void convert(CSquare); }; class CSquare { private: int side; public: void set_side(int x) { side = x; } friend class CRectangle; }; void CRectangle::convert(CSquare a) { width = a.side; height = a.side; } int main() { CSquare sqr; CRectangle rect; sqr.set_side(4); rect.convert(sqr); cout << rect.area() << endl; return 0; }
يوضح برنامج C++ هذا استخدام فئات الأصدقاء ووظائف الأعضاء، خاصة في سياق فئة CRectangle وفئة CSquare.
إعلان الكلاس:
- تم الإعلان عن فئتين: CRectangle و CSquare.
- يحتوي CRectangle على عضوين خاصين بالعرض والارتفاع، ومنطقة دالة للعضو لحساب مساحتها. كما أن لديها دالة تحويل العضو، والتي تم تعريفها لاحقًا خارج الكلاس.
- يحتوي CSquare على جانب واحد من أعضاء البيانات الخاصة ودالة عضو set_side لتعيين قيمته. يعلن عن CRectangle كفئة صديق.
الإعلان عن الكلاس Friend:
- تعلن CSquare عن CRectangle كفئة أصدقاء، مما يسمح لـ CRectangle بالوصول إلى أعضائها الخاصين.
تعريف دالة العضو:
- يتم تعريف دالة عضو التحويل لـ CRectangle خارج الفئة.
- يأخذ كائن CSquare كمعلمة ويعين جانبه لكل من عرض وارتفاع المستطيل.
الدالة الرئيسة main:
- في الدالة الرئيسية، يتم إنشاء الكائنات sqr من النوع CSquare والمستطيل من النوع CRectangle.
- تقوم الدالة set_side لـ sqr بتعيين side على 4.
- يتم استدعاء دالة تحويل rect باستخدام sqr كوسيطة، وتحويل المربع إلى مستطيل.
- ثم تتم طباعة مساحة rect الناتج.
المخرجات:
- بما أن طول ضلع المربع هو 4، فبعد تحويله إلى مستطيل، يصبح كل من عرض المستطيل وارتفاعه 4. وبالتالي فإن مساحة المستطيل الناتج هي 4 * 4 = 16.