اخوي رعد تسمحلي اساعدك عشان نفيد الاخوان كلهم انشاء الله
=============================
هذا درس على التحميل الزائد
المستوى : مبتدئ (برنامج بسيط جدا و غير معقد)
=============================
في الكلاسات (المخططات) كل العمليات الحسابية غير متوفرة كـ default ، بدلا من هذا ، يجب علينا نحن تعريف المعاملات الرياضية مثل الجمع و الطرح و غيره
(تقريبا كل معاملات الـ ++C تستطيع ان تحملهم)
فمثلا ، لو انشاء كلاس و اردت عملية جمع بين x و y فلن يتم الأمر ، خذ هذا الكود كمثال :
كود:
int main()
{
myClass v(5);
myClass w(2);
myClass u;
u = v + w;
return 0;
}
باعتبار احنا سوينا كلاس myClass و خليناه يستقبل قيمة ، و مثل ما شفنا مررنا 5 و 2 ، و جعلنا الكائن الثالث u يسوي جمع بين w و v. انت يمكن تعتقد أن الناتج راح يكون 7 ، ولكن بالحقيقة ، المترجم راح يعطيك error
اهني تأتي اهمية الـ operating overloading ، "التحميل الزائد" يخلينا نعطي معنى لكلمات الـ ++C للكائنات
بالحقيقة ، الكود السابق يمكن انجازه بطريقة اخرى متعبة جدا (لن اشرحها الآن) ، و لكن لماذا الكود الزائد ؟؟
في الكود الساابق صحيح ان سوينا جمع بين كائنين ، لكن المترجم يتسائل : ماذا تعني ؟؟
الكلاس ليس إنسان ليقول للمترجم "هذه عملية جمع"
فراح يطلع إيرور شسبيه بهذا :
كود:
'myClass' does not define this operator or a conversion to a type to the
predefined operator
، البرنامج اللي بحطه ، صحيح انه طويل السطور المهمة فيها تعليق بالعربي
و أي سؤال انا حاظر
كود:
#include <iostream>
#include <conio.h>
using namespace std;
////////////////////////////////////////////////////////////
///////////////////////Calculator Class/////////////////////
class Calculator
{
public:
//Default constructor
Calculator();
Calculator(float x, float y);
//Addition, overloading the operator
//تعريف التحميل الزائد
//لاحظ القيمة الراجعة من نوع الكلاس نفسه
//لأن اصلا القيمة الراجعة كائن
Calculator Calculator::operator+(const Calculator& rhs);
//Print function
void print();
//data memebers
float m_X;
float m_Y;
};
Calculator::Calculator()
{
m_X = 0;
m_Y = 0;
}
Calculator::Calculator(float x, float y): m_X(x), m_Y(y)
{}
//Overloading implementation
Calculator Calculator::operator+(const Calculator& rhs)
{
//هنا نقوم بجمع السينات و الصادات كالعادة مع بعض بدون أي تغيير
//هذا لأن احنا قمنا بالسابق بتعريف التحميل الزائد
//فالكلاس الآن يعرف شنو راح يسوي مع هذه الدالة
Calculator sum;
sum.m_X = m_X + rhs.m_X;
sum.m_Y = m_Y + rhs.m_Y;
return sum;
}
void Calculator::print()
{
cout << "x = " << m_X;
cout << endl;
cout << "y = " << m_Y;
cout << endl;
}
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
int main()
{
Calculator u(5, 5);
Calculator v(2, 2);
Calculator w;
//الحين نقدر نقوم بعملية الجمع بدون أية مشاكل
//و بنفس السنتاكس مال عملية الجمع العادية
w = u + v;
w.print();
getch();
return 0;
}