اتحاد طلبة هندسة الحاسوب والشبكات - المدونه الرسميه C.N.E : How to Write a Class in C++

المشاركات الشائعة

How to Write a Class in C++


للclass المكتوب بلغة C++ الصيغة العامة التالية:


بحيث أن class كلمة محجوزة في لغة C++ تُستخدم للإعلان عن الclasses ,, بينما MyClass هو اسم الclass المراد الإعلان عنه وهذا الإسم يجب ان يخضع لقواعد كتابة أسماء المُتغيرات مثل ان يبدأ بحرف وان لا يحتوي رموزاً خاصة وفراغات .. الخ ,, الأقواس { } تستخدم للتعريف بمحتوى الclass بحيث تتم كتابة التعليمات الخاصة بالclass بين هذين القوسين ,, وفي النهاية لا بد من كتابة الفاصلة المنقوطة بعد اغلاق القوس.

للإعلان عن object من الclass فإننا عادةً نقوم بالإعلان عن الobjects داخل الmain ,, والشكل العام لتعليمة الإعلان عن الobject هو ..



بحيث أن الMyClass هو اسم الclass ,, والmyObject هو اسم الobject المراد الإعلان عنه كنسخة من الclass ,, 
أما الأقواس ( ) فالهدف منها هو اختيار الconstructor الذي سيتم استدعاؤه تلقائياً عند إنشاء الobject وذلك اعتماداً على عدد القيم الممررة عبر الأقواس وأنواعها ,, اما اذا كانت الأقواس فارغة فإنه سيقوم بإستدعاء الconstructor الإفتراضي.

**************************************************

يُستفاد من الtemplate في اختصار الوقت والجهد ,, بحيث يتم اختيار نوع بيانات معمم لبعض المتغيرات بدلاً من الإعلان عنها عدة مرات بأنواع بيانات مختلفة ,, فبدلاً من الإعلان عن عدد من الإقترانات 
داخل نفس الclass وجميعها تقوم بالجمع بحيث يقوم احدها بجمع قيم من نوع int بينما يقوم الاخر بجمع قيم من نوع double وهكذا .. يتم الإعلان عن متغيرات بنوع بيانات عام بحيث يتم تعويض int أو double أو ... الخ مكان هذا النوع عند الإعلان عن الobject ,, وبالتالي يُمكن كتابة اقتران واحد للجمع بدلاً من كتابة عدة اقترانات للجمع داخل الclass.

الصيغة العامة لإستخدام الtemplate في الإعلان عن الclass هي ..



بحيث أن template هي كلمة محجوزة في لغة C++ تهدف للإعلان عن استخدام الtemplate للتعلميات المكتوبة داخل الأقواس التي تليها { } ,, بينما < > هو المكان الذي يتم الإعلان فيه عن نوع البيانات العام الذي سيستخدم في التعليمات ,, أما class T المكتوبة داخل ال< > فهي الجملة التي يتم من خلالها الإعلان عن T كنوع بيانات عام واسمه خاضع لقواعد كتابة اسماء المتغيرات.

أما للإعلان عن object من class يستخدم الtemplate ,, فإن الصيغة العامة لتعليمة الإعلان هي ..



كما ذكر سابقاً في صيغة الإعلان عن الobject بالإضافة إلى ضرورة كتابة <dataType> بحيث ان dataType تعبر عن نوع البيانات المراد تعويضها مكان كل T مكتوبة في الclass ,, وهذه الأنواع هي int, double, char .. الخ
في حال كان الobject يستدعي الconstructor الإفتراضي فإنه لا داعي لكتابة الأقواس.

المثال التالي يُوضح اهمية استخدام الtemplate عند الإعلان عن الclass ..


ناتج تنفيذ البرنامج هو ..



للحصول على نسخة نصية من البرنامج اعلاه .. تحميل

يحتوي الMyClass في المثال السابق على ثلاثة متغيرات من نوع T وهي الsummation والx والy تم الإعلان عنها كprivate ويحتوي ايضاً 
على ثلاث constructors وdestructor واحد بالإضافة إلى اقتران للجمع sum واقتران للطباعة print تم الإعلان عنها كpublic.* تذكر ان الaccess modifier الإفتراضي داخل الclass هو private في حال لم يتم كتابة access modifier قبل التعليمات.

وكما هو الحال بالنسبة لأي برنامج ,, سيتم تتبع التعليمات المكتوبة في الmain بغض النظر عن حجم التعليمات المكتوبة في أي مكان اخر وذلك لأن الmain هو المسؤول عن تنفيذ التعليمات واستدعاء الإقترانات من خارج الmain حسب الحاجة .. لنتتبع تسلسل تنفيذ التعليمات الذي ادى الى ظهور الناتج اعلاه ..



تعمل هذه التعليمة على إنشاء object بإسم m1 وتعويض int مكان كل T موجودة داخل الm1 ومن ثم استدعاء الconstructor الإفتراضي بحيث يخزن القيمة صفر في كل من الx والy.



تعمل هذه التعليمة على إنشاء object بإسم m2 وتعويض double مكان كل T موجودة داخل الm2 ومن ثم استدعاء الconstructor الثالث بحيث يخزن القيمة 5.5 في الy ثم يتم تخزين قيمة y في x ,, اي ان كلاً من x و y يحملان القيمة 5.5.



تعمل هذه التعليمة على إستدعاء الإقتران sum الخاص بm1 بحيث يجمع قيم الx والy ويخزن الناتج في summation ,, قيمة الsummation هنا تساوي صفر لm1.



تعمل هذه التعليمة على إستدعاء الإقتران sum الخاص بm2 بحيث يجمع قيم الx والy ويخزن الناتج في summation ,, قيمة الsummation هنا تساوي 11 لm2.



تعمل هذه التعليمة على إنشاء object بإسم m3 وتعويض char مكان كل T موجودة داخل الm3 ومن ثم استدعاء الconstructor الثاني بحيث يخزن القيمة 50 في الx ويخزن القيمة 70 في الy.



تعمل هذه التعليمة على إستدعاء الإقتران sum الخاص بm3 بحيث يجمع قيم الx والy ويخزن ما يكافئ الناتج بالASCII في الsummation ,, وقيمة الناتج هنا تساوي 120 وما يكافئها في الASCII هو x.



تعمل هذه التعليمة على إستدعاء الإقتران print الخاص بm1 بحيث يطبع نصوص ويطبع قيم الx والy والsummation الخاصين بالm1 ويطبع سطر جديد.



تعمل هذه التعليمة على إستدعاء الإقتران print الخاص بm3 بحيث يطبع نصوص ويطبع قيم الx والy والsummation الخاصين بالm3 ويطبع سطر جديد.



تعمل هذه التعليمة على إستدعاء الإقتران print الخاص بm2 بحيث يطبع نصوص ويطبع قيم الx والy والsummation الخاصين بالm2 ويطبع سطر جديد.

عند الوصول إلى نهاية الmain حيث اغلاق القوس ,, فإن فترة حياة كل من الobjects الثلاثة تنتهي وبالتالي يتم استدعاء الdestructor الخاص بكل object بحيث 
يتم استدعاء الdestructor الخاص بأخر object تم الإعلان عنه انتهاءاً بإستدعاء الdestructor الخاص بأول object تم الإعلان عنه.

**************************************************

لغايات الترتيب والمظهر يمكن الإعلان عن الإقترانات داخل الclass ثم تعريف محتوياتها خارج الclass .. ولا يختلف التنفيذ في هذه الحالة عن التنفيذ عند الإعلان عن الإقترانات وتعريف محتوياتها داخل الclass مباشرة.

لتوضيح ذلك ,, المثال التالي هو نفس المثال المذكور سابقاً ولكن تم تعريف محتويات الإقترانات خارج الMyClass.



للحصول على نسخة نصية من البرنامج اعلاه .. تحميل

لاحظ ضرورة كتابة الفاصلة المنقوطة بعد جميع جمل الإعلان عن الإقترانات في الMyClass وذلك لأن محتوياتها لم يتم تعريفها بعد.
عندما تكون الإقترانات معلن عنها ولكن محتواها غير معرف ,, عندها فقط يمكن وضع نوع البيانات دون ذكر المتغيرات بين الأقواس التي يتم تمرير القيم للإقتران عبرها .. فجميع الحالات التالية صحيحة بالنسبة لتعليمات الإعلان عن الإقتران دون تعريف محتواه ..





أما الحالات التالية فجميعها خاطئة بالنسبة لتعريف محتوى الإقتران خارج الclass ..





*تذكر ان جملة template تطبق على ما بين الأقواس التي تلي كتابتها فقط .. اذاً في حالة تعريف محتويات الإقترانات خارج الMyClass فإننا سنحتاج لجملة template قبل تعريف كل إقتران.

يستخدم الرمز :: أو Resolution Operator للوصول إلى الإقترانات المعلن عنها داخل الMyClass لغاية تعريف محتوياتها خارج الMyClass.

الصيغة العامة لكتابة تعريف محتويات اقتران خارج الclass هي ...



الصيغة العامة لكتابة تعريف محتويات اقتران خارج class يستخدم template هي ...



بحيث ان returnType هو نوع البيانات الراجعة بعد تنفيذ التعليمات المكتوبة داخل الإقتران ويتم ذكره لجميع الإقترانات بإستثاء الconstructors الdestructors واللذان لا يحتاجان لنوع بيانات راجعة ,, MyClass هو اسم الclass الذي تحتوي على اقترانات معلن عنها ولكن محتوياتها غير معرفة ,, <T> هو نوع البيانات العام الذي سيتم اسخدامه داخل تعليمات الإقتران المراد تعريف محتواه ,, myFunction هو اسم الإقتران المراد تعريف محتواه ,, الأقواس ( ) يوضع داخلها متغيرات مع انواعها البيانية وهي المتغيرات التي سيتم تخزين القيم الممرة للإقران فيها وتكون الأقواس خالية في حال لا يحتاج الإقتران الى استقبال أي قيم خارجية.

**************************************************

يتم استخدام الstruct بنفس اسلوب استخدام الclass ,, ولكن الفرق بينهما هو ان جميع التعليمات المذكورة داخل الclass هي private تلقائياً ,, بينما تكون جميع التعليمات المذكورة في الstruct عبارة عن public تلقائياً .. الا اذا تم ذكر access modifier يُغير من الحالتين السابقتين.

الصيغة العامة للإعلان عن الstruct هي ...



وللإعلان عن object من الstruct فإن الصيغة العامة لذلك هي ...



وهي ذات الشيء مقارنة مع جملة الإعلان عن object من الclass.

**************************************************

المؤشر Pointer والمرجع Reference في C++ ... يستخدم المؤشر ويحمل الرمز * للإشارة الى موقع مخزن في الذاكرة بينما يستخدم المرجع ويحمل الرمز & لربط موقعين في الذاكرة ببعضهما بحيث ان تغيير قيمة المتغير في احد الموقعين يؤثر في قيمة المتغير في الموقع الاخر.

مثلاً .. البرنامج التالي يوضح فائدة المؤشر والمرجع ..



بحيث يكون الناتج ..



للحصول على نسخة نصية من البرنامج اعلاه .. تحميل

وذلك لأن المؤشر x يشير الى موقع المتغير y في الذاكرة ,, والمتغير z مربوط مرجعياً مع المتغير y فأي تغيير على قيمة z سيؤثر في قيمة y والعكس صحيح.

الفرق في إستخدام رمز ال& بين جملتي x=&y و int &z=y هو أن الأولى تعني جعل المؤشر x يشير الى موقع المتغير y في الذاكرة بينما الثانية تعني ربط المتغير z مرجعياً مع المتغير y.

الرمز & يعني مرجع فقط اذا تم ذكره في الطرف الأيسر من جملة الإعلان مثل 
int &z=y وعدا عن ذلك فهو يعبر عن موقع المتغير في الذاكرة مثل x=&y.

*يستطيع المؤشر ان يشير فقط الى موقع لمتغير ذو نوع بيانات مطابق لنوع بيانات المؤشر ,, اي ان مؤشر int يشير الى int ,, ومؤشر double يشير الى double وهكذا ...

**************************************************

الإقتران التكراري Recursive Function ..

هو اقتران يستمر في استدعاء نفسه تحت شرط معين ,, ويتم الإستفادة من ناتج تنفيذ الإقتران بترتيب نظام الstack ,, اي ان الداخل اخراً خارج أولاً LIFO ,, مما يعني ان اول ناتج يتم الإستفادة منه هو ناتج اخر مرة يتم فيها استدعاء الإقران لنفسه ..

والصيغة العامة للإقتران التكراري هي ..



*يتم تمييز الإقتران التكراري عن غيره من الإقترانات بأن الإقتران التكراري يحتوي على تعليمة تستدعي الإقتران نفسه.
*يجب ان يكون هناك شرط لإعادة استدعاء الإقتران والا سيتمر الإقتران بإستدعاء نفسه للمالانهاية.

**************************************************

الtry والcatch ..

يستخدم الtry والcatch لتنفيذ تعليمات مكتوبة داخل الtry وفي حال وجود خطأ معين يتم ايقاف تنفيذ التعليمات في الtry والإنتقال الى تنفيذ التعليمات المكتوبة في الcatch .. والصيغة العامة للtry والcatch هي ..



بحيث ان exception يمثل الخطأ الواجب ظهروه خلال تنفيذ التعليمات المكتوبة في try لكي يتم تنفيذ التعليمات المكتوبة في الcatch.
try وcatch كلمتان محجوزتان في لغة C++.

**************************************************

الإعلان عن الobject كمؤشر .. ويتم ذلك بوضع الرمز * قبل اسم الobject المراد الإعلان عنه .. والصيغة العامة للإعلان عن الobject كمؤشر هي ..



ولكن هذا المؤشر في الحقيقة لا يمثل نسخة عن الclass لأنه وجد لكي يشير الى موقع object اخر من نفس الclass موجود في الذاكرة.
ولإنشاء object يحجز موقعاً ثابتاً في الذاكرة ,, نستخدم الصيغة التالية ..


لاحظ ضرورة الإعلان عن الobject كمؤشر في الطرف الأيسر من التعليمة ,, وتستخدم الnew وهي كلمة محجوزة في لغة C++ بحيث ان الهدف منها هو تحويل المؤشر الى object فعلي مخزن في موقع ثابت في الذاكرة ,, لذلك تم ذكر MyClass مرتين في التعليمة السابقة ,, الأولى للإعلان عن المؤشر والثانية لعمل object يحجز موقعاً ثابتاً في الذاكرة.

ويمكن ايضاً الإعلان عن الobject كمؤشر في جملة ثم تحويله الى object فعلي في جملة اخرى .. والصيغة العامة لذلك هي ..



ولإنشاء object يحجز موقعاً ثابتاً في الذاكرة من class يستخدم الtemplate ,, نستخدم الصيغة العامة التالية ..



بحيث يتم ذكر نوع البيانات المراد تعويضه مكان نوع البيانات العام في طرفي التعليمة.

*اذاً الفرق بين الobject الثابت في الذاكرة والمؤشر بأن الأول يتم استخدام new لإنشاؤه بينما الثاني يكتفي بذكر الرمز * قبل اسم الobject .. وكليهما يستخدم الرمز * في الإعلان عنه.
*لا يمكن للمؤشر من نوع int مثلاً ان يشير الى موقع الmyObject الذي يمثل نسخة عن الMyClass في الذاكرة وهنا تكمن ضرورة عمل object مؤشر.
*جميع المواقع الثابتة
 في الذاكرة والمحجوزة باستخدام new يمكن تحريرها بحيث تصبح متاحة لحجز بيانات اخرى وذلك بطريقتين ,, اما بإستخدام الكلمة المحجوزة delete ,, او بإعادة تشغيل الحاسوب .. اما غير ذلك فهي تشغل حيز من الذاكرة لا يمكن حجز اي شيء اخر فيه.
*الإستخدام الأكثر شيوعاً لمثل هذه الobjects هو الlinked-list بحيث تحتاج الى مواقع ثابتة في الذاكرة وتحتاج الى مؤشرات سواء لربط هذه المواقع او للإنتقال بينها.

**************************************************

سامر المناصرة
< >

ليست هناك تعليقات:

إرسال تعليق