لكلاسس عبارة عن نوع من البرميتر أو بالأصح مكتبة جديدة أحنا ننشأها لغرض معين هو شبيه بلستركجر بس الفرق بينهم ان لستركجر عنده بس ال private أو ما نسميه بالبرميتر ، بس ما عنده الجزء المتعلق بالفنكشنات public فنقدر نقول ان لكلاسس يتكون من جزئيين أساسيين ال private و ال public :
شكل لكلاسس بكون بهاذي الطريقة :
كود:
class [COLOR=#ff0000]nameOfClass[/COLOR] {
private :
// place of parameters of class
public :
// place of functions of class
};
ال private يحتوي على البرميتر الأساسية للكلاسس على سبيل المثال خل ناخذ المثال الأول من تيتوريل لكلاسس :
https://drive.google.com/file/d/0By6IydPqj2WAYU50YndJMThrc1E/view?usp=sharing
السؤال طالب ان أحنا نسوي كلاسس اسمه dataType و انه لازم يحتوي على ثلاث اشياء ( البرميتر الخاص بال private ) : اليوم ، الشهر و السنة و لازم نحدد نوع كل واحد مثل لستركجر أحيانا السؤال يذكر الانواع و احياناً ما يذكر احنا نستنتج نوعهم بنفسنا من خلال المكتوب مثل هذا المثال ما ذكر بس المعروف ان اليوم و الشهر و السنة تكون أرقام بدون كسور و أرقام ما تتعد ال 4 أرقام فبنستخدم النوع int و بتكون طريقة كتابتنا للكلاسس بهاذي الطريقة :
كود:
class dataType {
private :
int day;
int month;
int year;
};
حالياً كتبنا بس البريمتر الخاصة بلكلاسس و هاذي البرميتر بنسخدمتها في الفنكشنات الخاص بال public في لكلاسس ، نجي نكمل السؤال ، السؤال يذكر ان الديفولت برميتر لهذا لكلاسس هي day = 1 , month =1 , year = 2000 بما معناه ان في حال المستخدم ما دخل معلومات للبريمتر المنشئ بنوع هذا لكلاسس فبتكون قيم البرميتر المنشئ هاذي القيم ، يمكن الصورة تكون مشوشة شوي بس انشاء الله بعد ما يكتمل لكلاسس و نكتب المين بتتوضح الصورة ، بالإضافة ذكر ان ال day لازم يكون من 1 الى 31 فقط و ال month من 1 الى 12 و ال year من 2000 الى 2100 فلازم نراعي هاذي الشي خلال كتابة فنكشن الإدخال ( ال set ) هذا يعتبر افشنت أو مثل ما نقول الاشياء الي ممكن تأدي الى خطأ في البرنامج في حال المستخدم دخل غير هاذي القيم ، هو عادةً مو مطلوب عليكم الا اذا طلب السؤال نفسه بس اذا ما طلب فعادي ما تسوين هذا الشي ، نجي الحين لل public ، السؤال ذكر ان عندنا 5 فنكشنات set ، print ، return the data ( get) , increment one day بالإضافة الى ال constructor و destructor نبدء بفنكشن ال set الفنكشن عبارة عن فنكشن لإدخال المعلومات فما ترجع شي فنوعها دائماً راح يكون void و راح تنكتب بهاذي الطريقة :
كود:
void setDateType( int d , int m , int y );
لاحظي اني في برميتر الفنكشن كتبت فقط الحروف الأولى من كل برميتر مثل ال day كتبت بس d و ال month كتبت بس m و ال year كتبت بس y لانه في حال كتبت الاسم بالكامل في إحتمال يصير عندنا خطأ عند إستخدام الفنكشن يصير ايرور بسبب التشابه بين اسم البرميتر في لبرايفت
و داخل لكلاسس بتكون بهاذي الطريقة :
كود:
class dataType {
private :
int day;
int month;
int year;
public:
void setDateType( int d , int m , int y );
};
نجي للفنكشن الي بعدها ال print هي فنكشن تطبع المعلومات فقط ، فهي ما ترجع اي شي فبتكون من نوع void بالإضافة ان أحنا ما نحتاج ندخل برميتر فيها فبتكون بهاذي الطريقة :
و في لكلاسس :
كود:
class dataType {
private :
int day;
int month;
int year;
public:
void setDateType( int d , int m , int y );
void print();
};
باقي الفنكشنات بتنحط بمثل الطريقة فبتجنب اكتبهم في كل مرة و بكتبهم بالكامل بعد توضيح كل الفنكشنات
نجي لفنكش return the data أو مثل ما نسميها فنكشن ال get مثل ما ذكر السؤال فنكشن لترجيع قيم البرمتر المدخلة لها طريقتين في الكتابة بس يعتمد على السؤال نفسه هل يبغى ان احنا نرجع كل البرميتر مرة وحدة او كل واحد بروحه اذا كان كلهم فلازم نكتبها ك void اذا كل وحدة بروحها فبنكتبها حسب نوعها :
بالنسبة لل void فلازم كل البرميترس بتكون باي رفرنس فبنكتبها بهاذي الطريقة :
كود:
void getDataType([COLOR=#ff0000] int [/COLOR][COLOR=#0000ff]&[/COLOR][COLOR=#ff0000] d[/COLOR] , [COLOR=#ff0000]int [/COLOR][COLOR=#0000ff]&[/COLOR][COLOR=#ff0000] m[/COLOR] , [COLOR=#ff0000]int [/COLOR][COLOR=#0000ff]&[/COLOR][COLOR=#ff0000] y[/COLOR] );
في حال نبغى نكتب كل وحدة بروحها بينكتبون بهاذي الطريقة :
كود:
int getDay();
int getMonth();
int getYear();
السؤال ما حدد اذا يبغي فنكشن وحدة أو عدة فنكشنات فعندش الخيار لإستخدام اي من الطريقتين بس في حال السؤال قال function فقط فأنتين لازم تستخدمين ال void و اذا ذكر function
s فلازم تستخدمين الطريقة الثانية أو تستخدمين الطريقة الأولى بس تقسمينهم كل واحد بروحه بهاذي الطريقة :
كود:
void getDay(int& d);
void getMonth( int & m );
void getYear( int & y ) ;
الفنكشن الي بعدها هي increment one day فنكشن تزيد الايام يوم واحد و ما ترجع اي شي فبكون نوعها void و ما بتكون فيها اي برميتر مجرد بنحط استيتمنت تزيد الايام 1 داخل الفنكشن و بتكون بهاذي الطريقة :
بعدين نجي للكونستركتر و الدستركتر نبدأ بال constructor دائماً بكون أسمه مثل اسم لكلاسس بس تختلف كتابته من حالة الى حالة في حالته العادية بكون مكتوب فقط اسمه بهاذي الطريقة :
في حال السؤال ذكر ديفولت برميتر مثل السؤال المذكرور فبنعرف بين القوسين البرميتر المذكورة في لبرايفت بنفس الطريقة الي عرفناهم ابها في ال set بالإضافة ان أحنا بنساويهم ب قيم الديفوت المذكورة في السؤال بهاذي الطريقة :
كود:
dataType( [COLOR=#ff0000]int d[/COLOR] = [COLOR=#0000ff]1[/COLOR] , [COLOR=#ff0000]int m[/COLOR] = [COLOR=#0000ff]1[/COLOR] , [COLOR=#ff0000]int y [/COLOR]= [COLOR=#0000ff]2000[/COLOR] );
بالنسبة للدستركتور ( destructor ) فبنكتبها بهاذي نفس اسم لاكسس dataType بس بنضيف قبلها هاذي الإشارة
~ و نقدر نكتب هاذي الأشارة من الكيبورد اذا ضغطنا shift + حرف ال ذ في الكيبورد بس لازم تكون اللغة بالأنجلينزي بتكون طريقة كتاباته بهاذي الطريقة :
كود:
[COLOR=#0000ff]~[/COLOR]dataType();
في النهاية لكلاسس بكون مكتوب جدي :
كود:
class dataType {
private :
int day;
int month;
int year;
public:
void setDateType( int d , int m , int y );
void print();
void getDataType( int & d , in & m , int & y );
int getDay();
int getMonth();
int getYear();
void incrementDay();
dataType( int d = 1 , int m = 1 , int y = 2000 );
~dataType();
};
هذا لكلاسس بس في النهاية يبقى علينا فنكشنات لكلاسس لأن أحنا بس كتبنا ادخل لكلاسس لبروتتايب الخاص بهم و ما كتبناهم كامل
نجي للفنكشن الأولى ال set و لازم نراعي الافشنت الي ذكرها السؤال لحدود الارقام للأيام و الشهور و السنين فبنستخدم الاف ستيتمنت في هاذي الحالة بهاذي الطريقة
كود:
[COLOR=#0000ff]void[/COLOR][COLOR=#ff0000] dataType::[/COLOR][COLOR=#0000ff]setDateType( int d , int m , int y[/COLOR] [COLOR=#0000ff]){[/COLOR]
// For Day
if ( d >= 1 && d <=31 )
day = d ;
// For month
if ( m >= 1 && m <=12 )
month = m ;
// For year
if ( y >= 2000 && y <=2100 )
year = y ;
}
لاحظي بروتوتايب الفنكشن الي باللون الأزرق بتشوفين اني حطيت نوع الفنكشن في البداية void بعدها كتبت
هذا المكتوب هو عبارة عن إشارة بشكل ان هاذي الفنكشن هي نفسها فنكشن ال set الموجودة في لكلاسس و ان هذا ال implement مالها و خلال كتابتنا لكل فنكشن بنكتب النوع في البداية سواء كان void او اي شي ثاني بعدها اسم لكلاسس تتبعها لغلوبل
::و لازم يكونون ملتصقين باسم الفنكشن مثل ما شفنا في فنكشن ال set باقي الفنكشنات كلها بتكون بهاذي الطريقة ب ال constructor , ال destructor فقط بنكتب اسم لكلاس و لغلوبل ملاصق ليهم ، نجي لفنكشن ال get بتكون بهاذي الطريقة :
كود:
void dataType::getDataType( int & d , int & m , int & y ){
// For Day
if ( day >= 1 && day <=31 )
d = day ;
// For month
if ( month >= 1 && month <=12 )
m = month ;
// For year
if ( year >= 2000 && year <=2100 )
y = year ;
لاحظي داخل هاذي الفنكشن ان احنا قلبنا كل شي مكان البرميتر الاساسي في لكلاسس day , month , year حطينا البرميتر المدخلة من الفنكشن d , m , y على عكس فنكشن ال set ، هل هذا غلط ، لا مو غلط في حال كانت فنكشن ال get من نوع void دائماً نقلبهم السالفة فيها تفصيل شوي بس أفضل ما أذكره لانه يمكن تختلط الأمور عليش ، انزين في حال كان هناك عندة فنكشنات لل get و نوعهم هو نوع البرميتر المرجع فشلون بنكتبهم و شون بكون الامبلمنت مالهم ؟ بطبق على اول فنكشن getDay بهاذي الطريقة :
كود:
[COLOR=#0000ff]int[/COLOR] [COLOR=#ff0000]dataType::[/COLOR]getDay(){
[COLOR=#008000]return day;[/COLOR]
}
لاحظي مثل ما ذكرت سابقاً نوع الفنكشن في البداية بعدها اسم لكلاسس و لغلوبل ملاصق للفنكشن ، نجي لل implement ، لاحظي داخل الفنكشن مجرد سوينا رتيرن للبرميتر الي نبغيه هاذي الطريقة الثانية بس ما نكتب d مثل ال void لازم نكتب اسم البرميتر بالكامل الموجود في لبرايفت day
باقي الفنكشنات مثل الشي :
كود:
int dataType::getMonth(){
return month;
}
كود:
int dataType::getYear(){
return year;
}
نجي لفنكشن لبرنت و مثل الي قلناه سابقاً ينطبق عليها
كود:
void dataType::print(){
cout << " Day : " << day << " Month : " << month << " Year : " << year << endl ;
}
لاحظي ال implement مال فنكشن ل print مجرد سي أوت للبرميتر و دائماً تنكتب بهاذي الطريقة ، نجي لفنكشن increment day بنكتبها بهاذي الطريقة :
كود:
void dataType::incrementDay(){
day+=1 ;
}
مجرد نخلي اليوم يزيد 1 ، نجي لل contractor
كود:
[COLOR=#008000]dataType::[/COLOR]dataType( int d = 1 , int m = 1 , int y = 2000 ){
[COLOR=#0000ff]day[/COLOR] = [COLOR=#ff0000]d[/COLOR] ;
[COLOR=#0000ff]month[/COLOR] = [COLOR=#ff0000]m[/COLOR] ;
[COLOR=#0000ff]year[/COLOR] = [COLOR=#ff0000]y[/COLOR] ;
}
لاحظي اني ساويت البرميتر في لبروتوتايب بالبرايفت برميتر في لكلاسس بحيث انها تعطيها الديفولت فاليو ، بالإضافة لاحظي لبروتوتايب مجرد كتبت نوع لكلاسس و لغلوب قبل الكونستركتر ، نجي لل destructor :
كود:
[COLOR=#008000]dataType::[/COLOR]~dataType(){
// Empty we don't write anything
}
مثل الشي ينطبق على ال destructor بالنسبة للبروتوتايب مجرد نضيف اسم لكلاسس و لغلوبل و في الكتابة ما ننسى هاذي الإشارة
~ ، بالإضافة لاحظي داخل ال destructor مجرد كتبت كومنت انه فاضي ، بس هذا مو معناته انه ماله استخدام له استخدام بتتعلمونه لما تاخذون البوينتر و بالتحديد الداينمك اريه بس في الوقت الحالي مجرد تكتبون كومنت انه فاضي ، ملاحظة أخيرة لكلاسس ينكتب مكان ما ينكتب ال struct بين using namespace std ; و المين ، بالإضافة ان الامبلمنت ماال فنكشنات الببلك بينكتب بعد في هاذي المنطقة
هذا كل شي يتعلق بلكلاسس اذا في شي مو مفهوم تقدرين تسألين عنه ، بالنسبة للأسايمنت اذا كان التسليم الليلة فبسويه و برفعه على المنتدى و بعدين حاولي تحلينه بنفسش ، بس اذا بعده في وقت أفضل تحاولين فيه و اذا في أخطاء بعدلها و عذراً على الإطالة و التأخر في الرد