الفئات , والكائنات , والذاكرة في ++C

الفئات , والكائنات , والذاكرة

لعلنا أعطيناك انطباعا بأن كل كائن ينشأ يحتل مكانا في الذاكرة ببياناته ودواله . وهو تصور لا بأس به لتخيل الكائن كوحدة واحدة , ولكن الواقع أن دوال الفئة تكون عامة لكافة الكائنات , حيث إنها لا تتغير من كائن لأخر , ولا تكون الكائنات مستقلة في الذاكرة إلا في بياناتها , حيث يختص كل كائن ببياناته, ويصور الشكل هذه الحقيقة .

Object-Oriented Programming in C   _Page_0274_Image_0001

شكل الكائنات في الذاكرة

البيانات الاستاتيكية

عندما يعرف بيان بأنه من النوع الاستاتيكي , فإنه أيضا يكون عاما لكافة الكائنات , وبالتالي لا يتكرر الكائنات , فالبيان المحتفظ به فيه عام لها جميعا , وهو ما يصوره الشكل

Object-Oriented Programming in C   _Page_0277_Image_0001

شكل البيانات الاستاتيكية

وتطبيقات البيانات الاستاتيكية كثيرة حينما يهم بيان كافة الكائنات , ففي لعبة لسباق السيارات , يجب أن تعرف كل سيارة كم سيارة ما زالت موجودة في السباق , وبالتالي يجب أن يكون عداد السيارات متاحا للجميع . وفي أحوال أخري يراد أن يتمكن كل كائن من معرفة بيان عن الكائنات الأخري , كأن تعلم كل سيارة أين يوجد غيرها من السيارات . وإليك برنامج يستخدم هذا النوع من البيانات .

statdata.cpp


 


// statdata.cpp


// static class data


#include <iostream.h>


#include <conio.h>


 


class foo


   {


   private:


      static int count;   // only one data item for all objects


              // note: *declaration* only!


   public:


      foo() { count++; }  // increments count when object created


      int getcount()  { return count; }     // returns count


   };


 


int foo::count;       // *definition* of count


 


void main()


   {


   foo f1, f2, f3;        // create three objects


 


   cout << "\ncount is " << f1.getcount();  // each object


   cout << "\ncount is " << f2.getcount();  // sees the same


   cout << "\ncount is " << f3.getcount();  // value of count


   getche();


   }




وتلاحظ في هذا البرنامج أن البيان الاستاتيكي count , بعد أن أعلن في تعريف الفئة , عرف خارجها . باستخدام المؤثر "::" .



واستخدام البيانات الاستاتيكية محفوف بالمخاطر , فمن السهل الوقوع في الأخطاء , ولكنها مفيدة في بعض الأحيان .



ما معني هذا كله ؟



لعلك لاحظت أن كثيرا من الأمثلة يمكن تطبيقها بدون اللجوء للأسلوب الكائني في البرمجة , فما الجدوي من اللجوء إليه ؟



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



وفي بعض البرامج يصعب تحديد كائناتها ففي برنامج للعبة الشطرنج , ما الذي يمكن أن يجسد في كائن , أهي القطع , أم مربعات اللوحة , أم الأوضاع للقطع ؟ وليس هناك إجابة قاطعة لمثل هذه التساؤلات , فالأمر يخضع للتجربة والخطأ , وخبرة المبرمج .



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



] والأهم من ذلك , إمكانية التوارث , وسوف تري مدي خطورتها حين تشرح في مواضعها خلال المقالات القادمة [ .

تعليقات

المشاركات الشائعة من هذه المدونة

المؤثرات الحسابية في C++

دوال النمط الرسومي في ++C

المؤثرات المنطقية في C++