PDA

View Full Version : تابعی برای بازگرداندن نام متغیر



بـاران
سه شنبه 28 مهر 1394, 10:27 صبح
سلام دوستان.

یک متغیر رو قبلا تعریف کردم. حالا چطور می تونم به اسمش دسترسی پیدا کنم؟


مثلا یک کلاس داریم. در برنامه اصلی متغیری از نوع این کلاس رو تعریف می کنیم و براش اسم می گذاریم. حالا چطور از داخل کلاس می شه به اون اسم دسترسی داشت؟

(البته غیر از اینکه یک داده ی عضو برای اسم کلاس در نظر بگیریم.)

hamedBB
سه شنبه 28 مهر 1394, 11:01 صبح
می تونی اینطوری استفاده کنی که البته من پیشنهاد میکنم این حالت رو برای دیباگ استفاده کن نه برنامه های اجرایی



#define SHOW(temp_variable) std::cout << #temp_variable << std::endl
// some codes
int your_variable = 2;
SHOW (your_variable);

بـاران
سه شنبه 28 مهر 1394, 11:20 صبح
متشکرم.

این دقیقا همون چیزی که داخل پرانتز هست رو می نویسه. من می خوام از داخل کلاس، به اسم متغیری که داخل برنامه اصلی هست دسترسی داشته باشم. بهتره کدم رو بنویسم:

یک کلاس دارم به اسم CppArray. و یک تابع که می خوام اعضای آرایه رو چاپ کنه:





ostream& operator<<(ostream& os, CppArray& cp)
{


for(int i=0;i<cp.s;++i


cout<<cp.a[i]<<endl



return os
}



اینجا می خوام اسم آرایه ای که داخل برنامه اصلی تعریف شده رو هم چاپ کنه. یعنی اگه تعریف کردم

CppArray A

می خوام اینجا اعضا به این شکل چاپ بشن

A[0]=2 و غیره.

برای اینکار باید از داخل کلاس، به اسم متغیر (یعنی A) دسترسی داشته باشم. چطور اینکارو انجام بدم؟

hamedBB
سه شنبه 28 مهر 1394, 12:42 عصر
قضیه دقیقا همین هست که شما مجبوری از چنین راه هایی کامپایلر رو دور بزنی که اسم متغیر رو داشته باشی وگرنه من میدونم که این عمل محتوای داخل پرانتز رو چاپ می کنه.

اگر میخوای مقدار رو هم داشته باشی میتونی این شکلی استفادش کنی :



#define SHOW(temp_variable) std::cout << #temp_variable << " = " << temp_variable << std::endl

// some codes
int your_variable = 2;
SHOW (your_variable);






آرایه هم با متغیرهای تک خونه ای توی این روش هیچ فرقی نمی کنن. شما میتونی از این تابع واسه نمایش خونه های آرایت استفاده کنی.
اگه هم منظورت چیز دیگست که من متوجه نشدم.

بـاران
سه شنبه 28 مهر 1394, 13:02 عصر
اینجا من باید اسم متغیر رو بدونم که داخل پرانتز بنویسمش.

ولی وقتی دارم از SHOW داخل کلاس استفاده می کنم، نمی دونم هربار که یک متغیراز نوع اون کلاس ساخته شده، اسمش چی گذاشته شده.

الان واضح تر شد؟

hamedBB
سه شنبه 28 مهر 1394, 13:15 عصر
اینجا من باید اسم متغیر رو بدونم که داخل پرانتز بنویسمش.

ولی وقتی دارم از SHOW داخل کلاس استفاده می کنم، نمی دونم هربار که یک متغیراز نوع اون کلاس ساخته شده، اسمش چی گذاشته شده. (مگه داریم؟ مگه میشه؟ متغیر که واسه خودش بی صاحب ساخته نمیشه! اسم داره اگه هم آرایه باشه ایندکس داره! من فک کنم شما یه جای مسئلت رو داری اشتباه میری شاید هم مسئلت از سطح سواد من بالاتره که من در این صورت عذر میخوام!)

الان واضح تر شد؟ (نه بدتر شد)

اون لینکی هم که گذاشتی دقیقا همون چیزی بود که من گفتم. سوالش هم همون چیزی بود که من از سوال شما برداشت کردم!

بـاران
سه شنبه 28 مهر 1394, 13:29 عصر
آقا حامد من مبتدی هستم، مرسی که بهم پاسخ میدید.

از نظر خودم سوالم کاملا واضحه، نمی دونم چرا اینجوری می شه.

یبار دیگه توضیح میدم.

یک کلاس داریم به اسم CppArray . حالا از نوع این کلاس، متغیرهایی ساخته می شن که هرکدوم یه اسمی دارن.

من می خوام در داخل کلاس به اسم اون متغیرها دسترسی داشته باشم. مثلا یکبار اسمش هست A یکبار هست B یکبار C و غیره.

حالا من داخل کلاسم از چه تابعی استفاده کنم که هربار نام متغیر مربوطه رو برگردونه.



از کدی که شما دادید، تو تابع main() می تونم استفاده کنم. اونجا یک متغیر رو تعریف می کنم و دقیقا زیرش از SHOW استفاده می کنم. اما وقتی داخل کلاس هستم، نمی دونم تو main متغیر چه اسمی داره. می خوام "هر اسمی" که داشت، همون برگرده.

امیدوارم الان دیگه واضح شده باشه.

zero_ox
سه شنبه 28 مهر 1394, 13:39 عصر
من توصیه می کنم قبل ازهرکاری شما مبحث operator overloading یا سربارگذاری عملگرها رو در c++ مطالعه کنید می تونید ازلینک های زیر استفاده کنید
http://www.tutorialspoint.com/cplusplus/input_output_operators_overloading.htm

https://msdn.microsoft.com/en-us/library/1z2f6c2k.aspx

hamedBB
سه شنبه 28 مهر 1394, 13:45 عصر
آقا حامد من مبتدی هستم، مرسی که بهم پاسخ میدید. (وظیفست!)

از نظر خودم سوالم کاملا واضحه، نمی دونم چرا اینجوری می شه. (من کلا یکم مسائل رو دیر می گیرم)

یبار دیگه توضیح میدم.

یک کلاس داریم به اسم CppArray . حالا از نوع این کلاس، متغیرهایی ساخته می شن که هرکدوم یه اسمی دارن.

من می خوام در داخل کلاس به اسم اون متغیرها دسترسی داشته باشم. مثلا یکبار اسمش هست A یکبار هست B یکبار C و غیره.

حالا من داخل کلاسم از چه تابعی استفاده کنم که هربار نام متغیر مربوطه رو برگردونه.



از کدی که شما دادید، تو تابع main() می تونم استفاده کنم. اونجا یک متغیر رو تعریف می کنم و دقیقا زیرش از SHOW استفاده می کنم. اما وقتی داخل کلاس هستم، نمی دونم تو main متغیر چه اسمی داره. می خوام "هر اسمی" که داشت، همون برگرده.

امیدوارم الان دیگه واضح شده باشه. (حدودا فهمیدم مشکل کجاست ولی واسه اینکه بازم اشتباه راهنماییت نکنم کدت رو به شکل کد (نه فقط نوشته) بذار و بخشی که میخوای اسمش رو بدونی هم بذار که دقیق بت بگم چیکار کنی. میتونی سودوکد هم بذاری)

.............................

بـاران
سه شنبه 28 مهر 1394, 15:46 عصر
zero_ox ممنون از لینک هایی که گذاشتید.

آقا حامد این کدشه:



class CppArray
{
friend ostream& operator<<(ostream&,CppArray&);
public:
CppArray(int size, float initvalue);
~CppArray(){}
CppArray(const CppArray&);
float& operator[](int);
int Getsize();
private:
int s;
float* a;
};

ostream& operator<<(ostream& os, CppArray& cp)
{
for(int i=0;i<cp.s;i++)
{
//os<<Variable_Name<<"["<<i<<"]= "; ....inja mikham esme arraye chap beshe.
//Yani baraye (cout<<A), 'A' chap beshe, Baraye (cout<<B), 'B' chap beshe.
os<<cp.a[i]<<endl;
}

return os;
}

int main()
{
CppArray A;
CppArray B;

cout<<A;
cout<<B;
}

hamedBB
سه شنبه 28 مهر 1394, 16:27 عصر
چه خوب شد کدت رو گذاشتی چون بازم اشتباه منظورت رو فهمیدم.
راه مستقیمی برای این کار وجود نداره متاسفانه. راه غیر مستقیمش اینه که شما اسم متغیرت رو هم به عنوان پارامتر ورودی به تابعت به صورت string پاس بدی (به همون صورتی که تو جواب های قبلی گفتم میتونی اسم متغیرت رو داشته باشی). البته انجام این کار در تابعی که شما نوشتی و هدف این تابع ، مسخرست چون یه جورایی هدف این تابع اصلا به دست آوردن نام اون پارامتره! یعنی عملا جواب مسئله رو به تابع داریم میدیم! پس این راه هم به کارتون نمیاد. ولی همونطور که گفتم متاسفانه هیچ و تاکید می کنم "هیچ" راه مستقیمی برای انجام کاری که شما میخواید انجام بدید وجود نداره اما سوال جالبی بود.

بـاران
چهارشنبه 29 مهر 1394, 08:54 صبح
سلام، مرسی از راهنماییتون.

پس یعنی اسم متغیر هیچ جایی ذخیره نمی شه؟؟ چون در اونصورت باید بشه با استفاده از اشاره گر بازیابیش کرد.

hamedBB
چهارشنبه 29 مهر 1394, 08:58 صبح
سلام، مرسی از راهنماییتون.

پس یعنی اسم متغیر هیچ جایی ذخیره نمی شه؟؟ چون در اونصورت باید بشه با استفاده از اشاره گر بازیابیش کرد.

اسم متغیر فقط تا زمان کامپایل معنی داره از اون به بعد دیگه فقط یه آدرس قابل شناسایی در حافظه برای کامپایلر هست. برای همین هست که تابع باز گردوندن اسم متغیر هم که براتون گذاشتم به صورت ماکرو تعریف شده.
منظور اینکه در زمان اجرا (Runtime) شما چیزی به اسم "نام متغیر" نداری که بخوای ببینیش! واسه همین هم هست که در انجام این کار محدودیت هایی از این قبیل هست.