الفئات , والكائنات , والذاكرة في ++C
الفئات , والكائنات , والذاكرة
لعلنا أعطيناك انطباعا بأن كل كائن ينشأ يحتل مكانا في الذاكرة ببياناته ودواله . وهو تصور لا بأس به لتخيل الكائن كوحدة واحدة , ولكن الواقع أن دوال الفئة تكون عامة لكافة الكائنات , حيث إنها لا تتغير من كائن لأخر , ولا تكون الكائنات مستقلة في الذاكرة إلا في بياناتها , حيث يختص كل كائن ببياناته, ويصور الشكل هذه الحقيقة .
شكل الكائنات في الذاكرة
البيانات الاستاتيكية
عندما يعرف بيان بأنه من النوع الاستاتيكي , فإنه أيضا يكون عاما لكافة الكائنات , وبالتالي لا يتكرر الكائنات , فالبيان المحتفظ به فيه عام لها جميعا , وهو ما يصوره الشكل
شكل البيانات الاستاتيكية
وتطبيقات البيانات الاستاتيكية كثيرة حينما يهم بيان كافة الكائنات , ففي لعبة لسباق السيارات , يجب أن تعرف كل سيارة كم سيارة ما زالت موجودة في السباق , وبالتالي يجب أن يكون عداد السيارات متاحا للجميع . وفي أحوال أخري يراد أن يتمكن كل كائن من معرفة بيان عن الكائنات الأخري , كأن تعلم كل سيارة أين يوجد غيرها من السيارات . وإليك برنامج يستخدم هذا النوع من البيانات .
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 , بعد أن أعلن في تعريف الفئة , عرف خارجها . باستخدام المؤثر "::" .
واستخدام البيانات الاستاتيكية محفوف بالمخاطر , فمن السهل الوقوع في الأخطاء , ولكنها مفيدة في بعض الأحيان .
ما معني هذا كله ؟
لعلك لاحظت أن كثيرا من الأمثلة يمكن تطبيقها بدون اللجوء للأسلوب الكائني في البرمجة , فما الجدوي من اللجوء إليه ؟
الفائدة الأولي هي سهولة نمذجة الحياة الواقعية , فقطعة الغيار تبدو أقرب للواقع حين تجسد في كائن يحتوي كافة بياناتها والعمليات التي يمكن أن تتم عليها , من إضافة ومحو وتجميع أسعار .. ألخ , أما في البرمجة الإجرائية فالدوال مبعثرة في البرنامج ككل , فلا يبدو واضحا دورها .
وفي بعض البرامج يصعب تحديد كائناتها ففي برنامج للعبة الشطرنج , ما الذي يمكن أن يجسد في كائن , أهي القطع , أم مربعات اللوحة , أم الأوضاع للقطع ؟ وليس هناك إجابة قاطعة لمثل هذه التساؤلات , فالأمر يخضع للتجربة والخطأ , وخبرة المبرمج .
ولا تنس أخيرا أن البرمجة الكائنية تواجه تعقد البرامج , فليس مستغربا ألا تبدو قيمتها واضحة في البرامج البسيطة . وسوف يتضح هذا بدرجة أكبر في مقالات قادمة .
] والأهم من ذلك , إمكانية التوارث , وسوف تري مدي خطورتها حين تشرح في مواضعها خلال المقالات القادمة [ .
تعليقات
إرسال تعليق