منوی سریع

آموزش تابع و توابع دوست کلاس در برنامه نویسی C++ توابع دوست کلاس در برنامه نویسی C++ (Class Friend functions) :

قبلا یادآوری شد که اعضای یک کلاس اعم از داده ها یا توابع دارای 3 نوع سطح دسترسی می باشند که شامل دسترسی خصوصی private و دسترسی عمومی public و دسترسی حفاظت شده protected است .

اگر داده ها و توابع عضو یک کلاس از نوع private تعریف شوند فقط داده ها و توابع درونی آن کلاس در داخل همان کلاس می توانند به آنها دسترسی داشته باشند و هیچ جزء دیگری در بیرون از کلاس حتی شی ساخته شده از همان کلاس هم اجازه و توانایی دسترسی و کار با آنها را ندارند مگر تابعی را تعریف نماییم که در اصطلاح دوست(Friend) کلاس مورد بحث باشد .

آموزش تابع و توابع دوست کلاس در برنامه نویسی C++ پس تابع دوست یک کلاس، تابع ویژه ای است که می تواند به تمامی اعضای کلاس حتی اعضای private نیز دسترسی داشته باشد. تفاوتی نمی کند که تابع دوست کلاس را عمومی یا خصوصی تعریف نماییم. یک تابع دوست کلاس طبق الگوی زیر تعریف می شود که باید از کلمه کلیدی friend در ابتدای آن استفاده نمود :

friend type FunctionName(Parameters List...)
{
    Function Body...
}

آموزش تابع دوست کلاس و کلاس دوست کلاس و تعریف آنها در برنامه نویسی C++ مثال) به اتفاق یکدیگر مثالی ابتدایی از تعریف تابع دوست کلاس و نحوه بکارگیری آن در کلاس را بررسی می نماییم :


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Accumulator
{
private:
    int m_nValue;
public:
    Accumulator() { m_nValue = 0; }
    void Add(int nValue) { m_nValue += nValue; }
 
    // Make the Reset() function a friend of this class
    friend void Reset(Accumulator &cAccumulator);
};
 
// Reset() is now a friend of the Accumulator class
void Reset(Accumulator &cAccumulator)
{
    // And can access the private data of Accumulator objects
    cAccumulator.m_nValue = 0;
}

همانگونه که در کد برنامه نویسی C++ بالا ملاحظه می فرمایید در سطر 9 برای کلاس Accumulator، تابع دوستی بنام Reset تعریف شده که دارای پارامتری ورودی که یک شی از خود کلاس است می باشد .

در سطر 4 متغیری private بنام m_nValue تعریف شده است که فقط در داخل کلاس خود می توان به آن دسترسی داشت و در خارج از کلاس هر نوع دسترسی به این متغیر خصوصی منجر به خطا خواهد گشت مگر اینکه از یک تابع دوست کلاس برای این منظور استفاده کنیم که صحت دسترسی را در بیرون از کلاس Accumulator و در سطر 15 از کد فوق مشاهده می کنیم .

آموزش نحوه تعریف تابع دوست کلاس friend function و استفاده از آن در برنامه نویسی C++ دقت کنید که برای تعریف بدنه و عملکرد یک تابع دوست کلاس دیگر نیازی به استفاده از عملگر :: به همراه نام کلاس نمی باشد در صورتیکه قبلا توضیح داده شد برای تعریف تابع عضو کلاس در بیرون از آن کلاس باید نام کلاس بهمراه عملگر :: ذکر شود .

از این به بعد توضیحات نیز به همان زبان اصلی نوشته خواهد شد تا مقدمه ای برای تلاش در جهت بهبود ادبیات انگلیسی اینجانب باشد .

آموزش تعریف تابع دوست کلاس و استفاده از آن در برنامه نویسی C++ مثال) در زیر به برنامه ای برای بکارگیری تابع دوست کلاس در C++ می پردازیم :


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream.h>
#include <conio.h>

class  base
{
    int val1,val2;
   public:
    void get()
    {
       cout << "Enter two values:";
       cin >> val1 >> val2;
    }
    friend float mean(base ob);
};

float mean(base ob)
{
   return float(ob.val1+ob.val2)/2;
}

void main()
{
    clrscr();
    base obj;
    obj.get();
    cout << "\n Mean value is : " << mean(obj);
    getch();
}
Enter two values: 10  20
Mean Value is: 15

در برنامه C++ بالا کلاسی بنام base وجود دارد که دارای 2 متغیر عضو private از نوع int و تابعی بنام get که دارای پارامتر ورودی نیست و دسترسی public برایش تعریف شده و یک تابع دوست کلاس بنام mean که نوع دسترسی آن مهم نیست و نوع بازگشتی float را برمیگرداند و دارای یک پارامتر ورودی است که شیئی از همان کلاس base میباشد .

بدنه تابع دوست کلاس از سطر 16 تا 19 در خارج از کلاس تعریف شده و براحتی و با ساخت یک شی بنام ob به متغیرهای عضو private کلاس base دسترسی دارد که میانگین دو عدد ورودی را محاسبه می نماید. در سطر 18 ما از اصل تبدیل نوع (Type Casting) برای جلوگیری از بروز خطای محاسباتی در نتایج برنامه استفاده کردیم. در واقع ما با استفاده از اصل تبدیل نوع به کامپایلر اعلام می کنیم که هرچند متغیرهای اولیه از نوع int هستند اما حاصل نتیجه را به صورت float و بدون گرد کردن و با قسمت اعشارش می خواهیم .

در نهایت و در تابع اصلی برنامه نیز یک شی از کلاس را ساخته و از آن استفاده می کنیم. نکته ای که عزیزان باید توجه کنند تابع clrscr است که در فایل سرآیند conio.h تعریف شده و موجب می شود که محتویات صفحه نمایش یا همان خروجی را پاک نماید و حافظه خروجی برنامه را clear کند که اسن دستور را هم در سطر 23 از برنامه C++ بالا مشاهده می کنیم .

آموزش کلاس دوست کلاس در برنامه نویسی C++ کلاس دوست کلاس در برنامه نویسی C++ (Class Friend class) :

همانطور که یک تابع می تواند دوست یک کلاس باشد، یک کلاس هم می تواند برای کلاس دیگر دوست باشد که در این صورت کلاس دوست، به تمامی اعضای کلاس دیگر اعم از خصوصی یا حفاظت شده دسترسی خواهد داشت .

آموزش تعریف کلاس دوست کلاس و استفاده از آن در برنامه نویسی C++ مثال) در زیر به برنامه ای برای بکارگیری کلاس دوست کلاس در C++ می پردازیم :


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// friend class
#include <iostream>
#include <conio.h>
using namespace std;

class CSquare;

class CRectangle
{
    int width, height;
  public:
    int area (){return (width * height);}
    void convert (CSquare a);
};

class CSquare
{
  private:
    int side;
  public:
    void set_side (int a){side=a;}
    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();
  getch();
  return 0;
}
16

آموزش نحوه تعریف کلاس دوست کلاس friend class و استفاده از آن در برنامه نویسی C++ دوستان عزیز می خواهیم که کد بالا را بررسی یا Trace نماییم و کاملا مانند کامپایلر رفتار می کنیم، پس به مراحل این عمل دقت فرمایید که از کجا شروع، بررسی کرده و آنرا به پایان می رسانیم :

از تابع main شروع می کنیم پس وارد این تابع می شویم. در سطر 33 از برنامه می بینیم که شیئی بنام sqr از کلاسی بنام CSquare ایجاد شده است پس در مرحله بعدی به سراغ کلاس CSquare می رویم تا بررسی کنیم که چه اعضایی دارد و این اعضا چه کار یا کارهایی را انجام می دهند .

تعریف کلاس CSquare از سطر 16 شروع شده و تا سطر 23 ادامه میابد که دارای یک عضو خصوصی بنام side از نوع داده int و یک تابع عضو عمومی بنام set_side و کلاس دوست کلاس CRectangle است. تابع عضو set_side یک نوع داده ای int را بعنوان پارامتر ورودی دریافت می کند و مقدار آنرا در متغیر side قرار می دهد .

به ادامه بررسی یا trace برنامه از سطر 34 می پردازیم. در این سطر هم یک شی بنام rect از کلاس CRectangle ایجاد شده است، لذا به بررسی این کلاس در ادامه می پردازیم .

تعریف کلاس CRectangle از سطر 8 از برنامه شروع شده و تا سطر 14 ادامه میابد. این کلاس شامل دو متغیر عضو خصوصی بنامهای width و height از نوع داده ای int و دو تابع عضو عمومی بنامهای area و convert می باشد که وظیفه تابع اول حاصلضرب دو متغیر عضو خصوصی و وظیفه تابع دوم از سطر 25 تا 29 تعریف شده است که این تابع ورودی از نوع شی از کلاس CSquare را دارد .

در سطر 35 از برنامه با استفاده از شی ایجاد شده از کلاس CSquare به تابع عضو set_side با پارامتری با مقدار 4 دسترسی پیدا می کنیم لذا مقدار متغیر side به 4 تبدیل می شود .

در سطر 36 نیز با استفاده از شی ایجاد شده از کلاس CRectangle به تابع عضو convert با ورودی شی sqr دسترسی پیدا می کنیم. پس مقدار 4 در دو متغیر width و height قرار گرفته و در ادامه و در سطر 37 با دسترسی به تابع convert این دو مقدار در هم ضرب شده و حاصلضرب آن دو به عنوان خروجی بر میگردد و چاپ می شود که همان مقدار 16 است .

چون در سطر 22 از برنامه C++ بالا کلاس CSquare دوست کلاس CRectangle تعریف شده پس براحتی در سطرهای 27 و 28 به متغیرهای عضو خصوصی این کلاس دسترسی پیدا کرده و بر روی آنها کار می کند و در صورتیکه اگر دوست کلاس مورد نظر نبود این اجازه را نداشته و برنامه با خطایی روبرو میشد .

امیدوارم که مراحل بررسی یا trace یک برنامه را درک کرده و متوجه شده باشید که چگونه می شود ساختار هر برنامه ای را بادقت و بدرستی چک نمود که مهارت در این شیوه کمک شایانی به دید برنامه نویسی و نهایتا نوشتن یک برنامه صحیح در زبان برنامه نویسی C++ خواهد نمود .

آموزش برنامه نویسی C++   آموزش برنامه نویسی C++