PDA

View Full Version : operator overloading



nazKhatoon
چهارشنبه 20 آذر 1387, 09:02 صبح
برنامه اي مثل اين دارم:


class class1{
public:
bool operator == ( const class1 &right) {
x = right.x;
}

class1( int px ){
x = px;
}

operator int () {
return x;
}

private:
int x;
}

void main(){
class1 a(1), b(2) ,c(3);
if ( a == b )
cout << 'first';
if ( 4 == a )
cout << 'second';
if ( a == 5 ) //generates error
cout << 'third';
{

اين تنها نتيجه اي است كه من انتظار نداشتم!! چرا فقط همين خط خطا مي دهد a==5؟؟؟
با تشكر

emad_67
چهارشنبه 20 آذر 1387, 09:24 صبح
اين تنها نتيجه اي است كه من انتظار نداشتم!! چرا فقط همين خط خطا مي دهد a==5؟؟؟
با تشكرسلام
برنامت مشکل زیاد داره، بازم خیلی کامپایلر باهات راه اومده که فقط از همین 1 خط ایراد گرفته :لبخند:
اما مشکلات برنامت:
بعد از اتمام class تعریف شده باید ; بزاری.
این تابعی که overload کردی:


bool operator == ( const class1 &right) {
x = right.x;
}
باید مقداری از نوع bool برگردونه ولی هیچی برنگشته. ضمنا عملگر == رو شما به صورت = overload کردی(یعنی انتساب) و بعد توی main از اون به عنوان عملگر مقایسه ای توی if استفاده کردی.
اما علت اینکه از اون خط ایراد میگیره اینه که وقتی شما مینویسی:


if ( a == 5 ) //generates error
cout << "third";
کامپایلر اینو میبینه:


if ( a.operator ==(5) ) //generates error
cout << "third";
ولی شما توی بدنه تابع operator == توی کلاس تعریف کردی که این تابع باید const class & دریافت کنه، ولی داری int بهش میفرسیتی.
علت اینکه از این خط هم ایراد نمیگیریه همینه:


if ( 4 == a )
cout << "second";
چون شما 4 رو برابر a قرار دادی و کامپایلر اصلا overload ئی برای اون پیدا نمیکنه ولی اگر a==4 بنویسی مثل بالا ارور میده.
مشکل بعد اینکه که توی cout خروجی ها رو بین "" باید بزاری نه ''.
موفق باشید :چشمک:

nazKhatoon
چهارشنبه 20 آذر 1387, 14:19 عصر
مرسي وقت گذاشتين. :لبخندساده:درسته حق با شماست.:خجالت: در واقع برنامه من اين نبود و خيلي بزرگ بود اين رو به عنوان يه مثال كوچك گذاشتم. اصلاحش مي كنم كه:

برنامه اي مثل اين دارم:


}class class1

public:
bool operator == ( const class1 &right) {
if (x == right.x)
return true;
else
return false;
};

class1( int px ){
x = px;
}

operator int () {
return x;
}

private:
int x;
}

void main(){
class1 a(1), b(2) ,c(3);
if ( a == b )
cout << "first";
if ( 4 == a )
cout << "second";
if ( a == 5 ) //generates error
cout << "third
{

اما در مورد پاسخ شما، من عملگر int رو سربارگذاري كردم و بنابراين ميتونه a رو به يك int تبديل كنه و اين مقايسه رو بين دو عدد انجام بده. يه راه ديگه هم داره و اون اينكه 4 رو با استفاده از سازنده تك مقداري به يك شي از نوع class1 تبديل كنه و اين مقايسه رو بين دو شي انجام بده. در واقع اين خط خطا مي ده چون دو راه براي انجام كارش داره و نميدونه كدوم رو انتخاب كنه اما نميدونم چرا خط قبل اين دو راه براش نيست!!

اگر عملگر == رو خارج از كلاس به صورت يه تابع سراسري يا دوست كلاس معرفي كرده و بنويسم رفتار برنامه كلا تغيير مي كنه.
با تشكر

emad_67
چهارشنبه 20 آذر 1387, 17:22 عصر
شما int ئی رو که overload کردی برای وقتی به درد میخوره که اینجوری بنویسی:


if ( (int)a == 5 ) //generates error
cout << "third";
یعنی خودت تبدیل صریح انجام بدی. اما اگر نخوای تبدیل صریح داشته باشی باید خود تابع operator == رو هم overload کنی. به این شکل:


bool operator == ( int right)
{
if (x == right)
return true;
else
return false;
}
اون موقع حتی اگر اینجوری هم بنویسی درسته:


if ( 4 == a )
cout << "second";


اگر عملگر == رو خارج از كلاس به صورت يه تابع سراسري يا دوست كلاس معرفي كرده و بنويسم رفتار برنامه كلا تغيير مي كنه.
اصلا نیازی به همچین کاری نیست.
ضمنا کدت رو در بین تگ کد قرار بده.

nazKhatoon
شنبه 23 آذر 1387, 09:03 صبح
[quote=emad_67;647599]شما int ئی رو که overload کردی برای وقتی به درد میخوره که اینجوری بنویسی:


if ( (int)a == 5 ) //generates error
cout << "third";
یعنی خودت تبدیل صریح انجام بدی.

با تشكر از شما، نه، اين طوري نيست و اين تبديل ضمني انجام ميشه.