PDA

نسخه کامل مشاهده نسخه کامل : دو سوال در مورد operator



Mehran NZ
12-11-2007, 23:52
دوستان من در ساختن operator در C++ به سه مشکل بر خوردم
1.در operator= باید بصورت زیر کد رو نوشت می خواستم بدونم منظور از ratio& در اول کد چیه و دقیقا چه کاری انجام میده؟
(اون قسمت رو قرمز کردم)


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

2.در مورد اشاره گر this اگه یه توضیحی بدید ممنون می شم که الان دقیقا داره به کجا اشاره می کنه؟!

3.این مشکل یکم عجیبه من operator+ روبصورت زیر پیاده سازی کردم و قاعدتا نباید مشکلی داشته باشه ولی کامپایلر پیغام خطای عجیبی میده که در پایین کدم اوردمش در ضمن من از visual studio 2003 استفاده می کنم.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

خطای اعلام شده


--------------------Configuration: Text1 - Win32 Debug--------------------
Compiling...
Text1.cpp
C:\c++\1\Text1.cpp(5) : fatal error C1001: INTERNAL COMPILER ERROR
(compiler file 'msc1.cpp', line 1786)
Please choose the Technical Support command on the Visual C++
Help menu, or open the Technical Support help file for more information
Error executing cl.exe.

m3hrz4d
13-11-2007, 00:46
منظور از &ratio اینه که تابع یک ارجاع بازمیگردونه نه یک کپی.همونطور که میدونی this به شی جاری اشاره میکنه و وقتی * پشتش قرار میگیره -مثل وقتی که * پشت یک اشاره گر معمولی قرار میگیره- خود شئ مد نظر گرفته میشه نه اشاره گرش که با توجه به نوع مقدار برگشتی تابع که ارجاع به شئ هست, تابع یک ارجاع به شئ ی که اون رو فراخوانی کرده برمیگردونه.
کدی هم که گفتی error میده رو من توی (VS 2003(VC++7.0 عینا کپی کردم مشکلی نداشت و برنامه 8 6 رو چاپ کرد.

Mehran NZ
13-11-2007, 02:02
this روگرفتم سوال سوم هم انگار مشکل از کامپایلر منه
حالا می رسیم به این پایینی که یکم گیره

منظور از &ratio اینه که تابع یک ارجاع بازمیگردونه نه یک کپی.
1. چرا اصلا ما باید از operator = استفاده کنیم یعنی فرقش با کپی ساز چیه؟ چه کاری این انجام میده که کپی ساز نمی تونه؟
2. یعنی عبارت &ratio فقط یک جور علامته برای جدا کردن کپی ساز از operatoe = و کار خاصی نمی کنه؟؟!!!!

m3hrz4d
13-11-2007, 14:30
this روگرفتم سوال سوم هم انگار مشکل از کامپایلر منه
حالا می رسیم به این پایینی که یکم گیره

1. چرا اصلا ما باید از operator = استفاده کنیم یعنی فرقش با کپی ساز چیه؟ چه کاری این انجام میده که کپی ساز نمی تونه؟
2. یعنی عبارت &ratio فقط یک جور علامته برای جدا کردن کپی ساز از operatoe = و کار خاصی نمی کنه؟؟!!!!
اینجا 2 تا سوال سوال جدا مطرحه.یکی اینکه چرا اصلا ما operator = رو گرانبار(Overload) میکنیم؟ میگه نمیشه همینطوری هم با دستور انتساب یک شی رو به یک شی دیگه انتساب بدیم؟ :
وقتی ما در حالت عادی 1 شی رو به یک شی دیگه انتساب میدیم داده های شی اول عینا توی داده های شی دوم قرار میگیرن که در مواقعی (مثل کلاس رشته یا اکثر وقت هایی که از new استفاده میشه توی کلاس)ما نمیخواهیم داده ها عینا کپی بشن و میخواهیم خودمون عملیاتی رو انجام بدیم و دستی کار انتساب رو انجام بدیم.

سوال دوم اینه که تایپ خروجی تابع operator = چی باید باشه؟
دستور انتساب توی ++C کلا اینطوری پیاده سازی شده که وقتی 1 متغیر رو به 1 متغیر دیگه نسبت میدی بعد از اینکه کار انتساب تموم شد یک ارجاع به شی دوم برگردونده میشه.یعنی اگه مثلا اون متغیر یک شی باشه و set هم یک متد از کلاس, دستور :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
معادل دستور :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
هستش یعنی عبارت (a= b) یک ارجاع از شی سمت چپ برمیگردونه.
به همین خاطر ما هم که operator = رو Overload میکنیم تایپ خروجیمون یک ارجاع به شی فراخواننده(سمت چپ) هستش که اینجا با ratio& نشونش میدیم.یعنی بجای ارسال یک کپی جدید (ratio بدون &) ارجاع همون شی اول رو برمیگردونیم.

در صورتی که توی جمع اینطور نیست و وقتی 2 شی جمع میشن یک شی جدید که حاصل جمع 2 شی قبلی هست برگردونده میشه(توی مثالی که زدی z) واسه همین دیگه & برای ratio نمیگذاریم.
امیدوارم گیجت نکرده باشم.

Mehran NZ
13-11-2007, 15:51
توضیحاتت کامل بود و جای سوالی باقی نذاشت
فقط مجبور شدم سه چهار باری بیام از اول بخونمش
امید وارم موفق باشی [ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

someone
13-11-2007, 19:42
سلام.
ممنون از دوست خوبم به خاطر توضيحات كاملشون.

دليل پست من به خاطر مشكلي بود كه در مورد كامپايلرتون پيش اومد :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

براي حل شدن مشكل :
1- precompiled header از برنامه حذف كنين(stdafx). (يك پروژه جديد و خالي ايجاد كنين)
2- از سوئيچ Zm#nn/ علاوه بر ساير سوئيچ ها استفاده كنين. (nn عددي بين 100 تا 2000 ميتونه باشه)

Mehran NZ
13-11-2007, 20:37
براي حل شدن مشكل :
1- precompiled header از برنامه حذف كنين(stdafx). (يك پروژه جديد و خالي ايجاد كنين)
2- از سوئيچ Zm#nn/ علاوه بر ساير سوئيچ ها استفاده كنين. (nn عددي بين 100 تا 2000 ميتونه باشه)

با تشکر از جواب و راهنماییتون ولی
مثل اینکه شما اشتباه کردید سرفایل stdafx در vs 2005 بطور خودکار ایجاد می شه ولی من از نسخه 2003 دارم استفاده می کنم
و این سرفایل رو از اول نذاشته بودم که بخوام پاکش کنم !(راستش و بخواید اصلا نمی دونم چی هست یه تاپیک هم در موردش زدم)
سوییچ Zm#nn/ دیگه چی چی بیده؟ [ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
فکر کنم یک جور سر فایله درسته؟اگه اشتباه نکنم بد تایپ کردید

Mehran NZ
13-11-2007, 23:03
someone جان بابا بیا بدادم برس این کامپایلرم حسابی قاطی کرده ببین برای برنامه زیر چه خطایی میده در حالی که
همین برنامه رو تو pm به m3hrz4d دادم کامپایلکرد گفت درست کار می کنه


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

اینم خطاش
--------------------Configuration: Text1 - Win32 Debug--------------------
Compiling...
Text1.cpp
C:\c++\2\Text1.cpp(21) : error C2248: 'num' : cannot access private member declared in class 'ratio'
C:\c++\2\Text1.cpp(11) : see declaration of 'num'
C:\c++\2\Text1.cpp(21) : error C2248: 'num' : cannot access private member declared in class 'ratio'
C:\c++\2\Text1.cpp(11) : see declaration of 'num'
C:\c++\2\Text1.cpp(21) : error C2248: 'den' : cannot access private member declared in class 'ratio'
C:\c++\2\Text1.cpp(11) : see declaration of 'den'
C:\c++\2\Text1.cpp(21) : error C2248: 'den' : cannot access private member declared in class 'ratio'
C:\c++\2\Text1.cpp(11) : see declaration of 'den'
C:\c++\2\Text1.cpp(27) : error C2593: 'operator ==' is ambiguous
Error executing cl.exe.

Text1.exe - 5 error(s), 0 warning(s)