الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

الدوال الصديقة friend functions في السي++

بدأه ghas1991 في 12 أغسطس 2010 · 4 رد · 6,894 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

السلام عليكم

الكثير من المبرجين عندما يقوم بعمل كلاس (فئة) قد يحتاج لدالة خارجة عن الكلاس لكن لها الصلاحية في التغيير في المتغيرات 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

uXJP5.png

str.cpp

j6v6j.png

كما رايتم قمنا بتعريف المعاملات التي هي في الاصل عبارة عن دوال

و جعلناها دوال صديقة للصنف str

و اكيد انكم لاحظتم انما قمنا بكتابة

s.ch_arr داخل الدالة التي هي في الاصل لا تنتمي للفئة

لكن تمكنا من ذلك لاننا عرفناها كدالة صديقة و بالتالي تمكنا من الوصول للمتغيرات الخاصة بدون اي اخطاء

لنجرب هل فعلا تعمل

main.cpp

Uw30d.png

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

adeED.png

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

و السلام عليكم

1
#2

مشكور وجزاك الله خير على الشرح

وفيت واديت بانتظار جديدك

#3

السلام عليكم

شرح موقف اخى الكريم

جزاك الله خيرا

معذره موضوعك لم يحتوى على كود لكى اذا حاول اى قرئ للكود

ان يجرب ما فعلته لا يستطيع

فقومت بعمل كود للتجربه

ليكى يكون الموضوع متكاملا نوعا ما

ارجوا ان تقبله منى وتقبل مرورى

MyString.h

// header file
#include<fstream>
using namespace std;
#ifndef MYSTRING_H
#define MYSTRING_H
class MyString
{
private:
	static const int size = 100;
	char str[size];
public:
	MyString();
	MyString(char s[]);
	MyString & assign(char s[]);
	MyString & assign(MyString &f);
	MyString & append(char s[]);
	MyString & append(MyString &f);
	friend istream & operator>>(istream & IS,MyString & f);
	friend ostream & operator<<(ostream & OS,MyString & f);
};
#endif

MyString.cpp

// impelementaion file
#include "MyString.h"

#include"MyString.h"
#include<string.h>
MyString::MyString(){}
MyString::MyString(char s[])
{
	strcpy(str,s);
}
MyString & MyString::assign(char s[])
{
	strcpy(str,s);
	return * this;
}
MyString & MyString::assign(MyString & f)
{
	strcpy(str,f.str);
	return *this;
}
MyString & MyString::append(char s[])
{
	strcat(str,s);
	return * this;
}
MyString & MyString::append(MyString & f)
{
	strcat(str,f.str);
	return * this;
}
istream & operator>>(istream & IS,MyString & f)
{
	IS>>f.str;
	return IS;
}
ostream & operator<<(ostream & OS,MyString & f)
{
	OS<<f.str;
	return OS;
}

main.cpp

// main file
#include<iostream>
#include"MyString.h"
using namespace std;
void main(){
	MyString str("Mahmoud");
	cout<<str<<endl;
}

Software Developer
Mahmoudkelany.com


 

#4

العفو

اخي محمود وضعت الاكواد في صور

و شكرا لك على التطبيق بارك الله فيك

#5
ghas1991 كتب:

العفو

اخي محمود وضعت الاكواد في صور

و شكرا لك على التطبيق بارك الله فيك

ايوه افهمك

لكن انا قصدى ان اللى يريد ان يجرب البرنامج اكيد هيحتاج للكود يطلع عليه علشان يجرب

مش يفكر فى باقى الكود كله

هو عاوز يعرف يعنى ايه friend function

والكود فالصور غير كامل

شكرا لك على تقبل مشاركتى

جزاك وجزانا الله خيرا

وبارك فيك اخى الكريم

Software Developer
Mahmoudkelany.com


 

مواضيع مشابهة