بسم الله الرحمن الرحيم
السلام عليكم
الكثير من المبرجين عندما يقوم بعمل كلاس (فئة) قد يحتاج لدالة خارجة عن الكلاس لكن لها الصلاحية في التغيير في المتغيرات private الخاصة بالفئة
و خير مثال على ذلك هو اعادة تحميل << و >>
فمثلا لديك كلاس له نفس عمل string اي انشئت فئة string خاصة بك
لكنك لن تستطيع كتابة السلسلة المخزنة في الكائن باستعمال cout و ايضا ادخال المسخدم السلسلة مباشرة باستعمال cin
الحل الامثل هو اعادة تحميل << و >> لكنهما خارجات عن الفئة
ف<< ينتمي لفئة istream و >> ينتمي لفئة ostream
لهذا يجب ان تعيد التحميل خارج الكلاس
لكن هنا ستجد مشاكل خاصة في <<
لانك ستحتاج للوصول المباشر للمتغير الذي تخزن فيه السلسلة النصية و هذا غير مسموح به لانه private و الدالة << خارجة عن الكلاس
حل المشكل؟
لحل المشكل سنستعمل مفهوم الدوال الصديقة friend functions
هذه الدوال تتميز بانها تعرف في وسط الفئة في اي مكان لا تطبق عليها محدادت الوصول private و غيرها و خارجة عنها اي لا يمكن الوصول لها من خلال كائن من الفئة
لكن هذه الدوال تتميز بانه لها الصلاحية في التعديل على المتغيرات الخاصة بالفئة مباشرة مثل اي دالة عضو في الفئة
طريقة التعريف العامة تكون هكذا
friend function_type function_name(function_params);
طبعا التعريف يكون داخل تعريف الفئة
funcyion_type نوع الدالة (void , float , double,...)
function_name اسم الدالة
function_params البارامترات التي تستقبلها الدالة
كما تلاحظون هي مثل اي دالة عادية لكن تضاف لها الكلمة المحجوزة friend قبل نوع الدالة
سيكون مثالنا ان شاء الله هو بناء فئة مثل string بسيطة جدا جدا
و سنقوم باعادة تحميل المعاملات << و >> فيها باستعمال مفهوم friend functions
لن اشرح طريقة انشاء الفئة ساضعها مباشرة و اشرح الجزء الخاص باعادة التحميل ان شاء الله
str.h

str.cpp

كما رايتم قمنا بتعريف المعاملات التي هي في الاصل عبارة عن دوال
و جعلناها دوال صديقة للصنف str
و اكيد انكم لاحظتم انما قمنا بكتابة
s.ch_arr داخل الدالة التي هي في الاصل لا تنتمي للفئة
لكن تمكنا من ذلك لاننا عرفناها كدالة صديقة و بالتالي تمكنا من الوصول للمتغيرات الخاصة بدون اي اخطاء
لنجرب هل فعلا تعمل
main.cpp

النتيجة المحلصة عليها ان شاء الله

اعتذر اذا كانت هناك اخطاء فهذا او شرح لي في المنتدى
و السلام عليكم