PDA

View Full Version : رفتار تابع friend (؟)



hosseinam1370
شنبه 15 فروردین 1394, 16:31 عصر
دوستان ، مگه ما در یک کلاسی بیایم یک تابع رو به عنوان دوست معرفی کنیم ، و متد اون تابع رو در خارج از کلاس بنویسیم ، نباید به تمامی توابع و متغییر های اون کلاس دسترسی داشته باشیم؟!!
پس چرا اینجا اینطوری نیست؟
یعنی چرا در این کد به متغییر name دسترسی ندارم من؟

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
class daneshjoo
{
public:
string name;
friend void vorod();
};

void vorod()
{
cout << "name khod ra vared konid: ";
cin >> name;
}


int main()
{

daneshjoo hossein;
vorod();
system ("pause");
}




حالا طبق تعریف های کتاب ، اگه من بخام یه شی رو به عنوان پارامتر تعریف کنم و یه شی رو از تابع main به عنوان آرگومان بفرستم ، مثله کد زیر ،
اگه تابع به صورت friend هم تعریف نشه ، هیییچ مشکلی پیش نمیآد، دیگه چه نیاز به friend هست؟؟!!
میخام بگم این دوتا کد باهم فرقی ندارند::

با friend:
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
class daneshjoo
{
public:
string name;
friend void vorod(daneshjoo);
};

void vorod(daneshjoo m)
{
cout << "name khod ra vared konid: ";
cin >> m.name;
}


int main()
{

daneshjoo hossein;
vorod(hossein);
system ("pause");
}




بدونه friend:
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
class daneshjoo
{
public:
string name;
};
void vorod(daneshjoo m)
{
cout << "name khod ra vared konid: ";
cin >> m.name;
}


int main()
{

daneshjoo hossein;
vorod(hossein);
system ("pause");
}




با تشکر.

amirtork
شنبه 15 فروردین 1394, 16:54 عصر
سلام،
درست هست، باید دسترسی داشته باشیم، و داریم!
در کد اول شما، مشکل این هست که شما اصلا متغیر name ندارید! که مقدار ورودی رو در اون ذخیره کنید! و فکر میکنم به این خاطر هست که فراموش کردید که به عنوان ورودی یک شی daneshjoo رو بفرستید به تابع و از
daneshjooName.name استفاده کنید.
در مورد فرق بین اون دو کد هم، شما موقعی میتونید از یک تابعی که به صورت friend برای یک کلاس نیست، در مورد اعضا ی اون کلاس استفاده کنید که اعضا ی اون کلاس public باشند، و یا حداقل عضوی که شما میخواهید به آن دسترسی داشته باشید، در غیر اینصورت دسترسی امکان پذیر نیست.
اما اگر تابع به صورت friend برای اون کلاس تعریف بشه، به اعضای private و protected هم دسترسی داشته باشید.

hosseinam1370
شنبه 15 فروردین 1394, 17:23 عصر
ممنون دوسته عزیز.
من فکر میکردم که تابعی که با friend معرفی میشه ، باید مستقیما مثله این کد به متغییر هاش دسترسی داشته باشه:

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
class daneshjoo
{
string name;
void vorod();
};
void daneshjoo :: vorod()
{
cout << "name khod ra vared konid: ";
cin >> name;// be in sorat ke alan be name dastrasi darim/
}


int main()
{

daneshjoo hossein;

system ("pause");
}

amirtork
شنبه 15 فروردین 1394, 17:53 عصر
نه در اون حد مستقیم D:
با توجه به اینکه تابعی که به صورت friend تعریف میشه، عضو کلاس محصوب(این الان از لحاظ املایی مشکل داره نه؟) نمیشه، بنابراین باید شی ای که قرار است مورد استفاده قرار بگیرد، به تابع ارجا داده شود.

hosseinam1370
شنبه 15 فروردین 1394, 18:41 عصر
آره:لبخند:.گوگل کلمه رو بزنی ،درستشو برات میگه.منم گوگل زدم فهمیدم:چشمک: محسوب (https://www.google.com/search?q=%D9%85%D8%AD%D8%B3%D9%88%D8%A8&spell=1&sa=X&ei=RvofVfTEKcjWavW3gcAP&ved=0CBoQBSgA&biw=1366&bih=697) .

اونم فهمیدم.ممنون.

omid_kma
شنبه 15 فروردین 1394, 19:04 عصر
البته به نظر من بهتره friend خیلی کم استفاده بشه چون شی گرایی و اون protection ای که فیلد های private کلاس دارن رو از بین میبره داخل این مثالی که زدید من لزومی به نوشتن تابع friend نمی بینم بهتر بودن name رو private میزاشتید بعد یک تابع setName تعریف می کردید داخل اون به name مقدار میدادید
تنها جایی که برای من کاربرد داشته زمان هایی هستش که operator<< و >> رو برای cout,cin کردن یک کلاس مینویسم مثلا این http://coliru.stacked-crooked.com/a/0d7aa0707900503d

hosseinam1370
یک شنبه 16 فروردین 1394, 00:11 صبح
آره.منم بیشتر برای اینکه توان خوندن یه کد بالا بره دارم اینارو تمرین و یاد میگیرم.

با تشکر.