الدرس 9 من 10
الأصناف
- 14 دقيقة
- 5 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
إخفاء الحقول بـ private والمُنشئ والتغليف
الشرح
حقول struct مكشوفة لأي كود يصل إلى الكائن، فلا شيء يمنع hero.hp = -50;. أما الصنف class فهو الفكرة نفسها مع فرق واحد، وهو أنّ أعضاءه خاصّة (private) ما لم تقل غير ذلك. فما تحت public: يستعمله الكود من الخارج، وما تحت private: لا تصل إليه إلا دوال الصنف نفسه، وإذا حاولت الوصول إليه من الخارج رفض المترجم الكود، فالمترجم نفسه يحمي القاعدة.
والمُنشئ (constructor) دالة تحمل اسم الصنف وليس لها نوع إرجاع، وتُنفَّذ عند إنشاء الكائن مثل Inventory bag(3);. وهو أول ما يحمي الكائن، فيكون الكائن سليمًا من لحظة إنشائه، وتصير السعة السالبة صفرًا قبل أن يستعملها أحد. ولا يمكن أن يحمل حقل ودالة الاسم نفسه، لذلك جرت العادة أن تُضاف شرطة سفلية في آخر اسم الحقل الخاصّ، فيكون capacity_ للحقل وcapacity() للدالة.
وهذا ما يُسمّى التغليف (encapsulation)، فقاعدة «لا تتجاوز العناصر السعة» تبقى صحيحة لأنّ الطريقة الوحيدة لإضافة عنصر هي add، وهي تتحقّق أوّلًا ثم تُرجع false بدل أن تخالف القاعدة. وتكون دوال القراءة const كما في الدرس السابق. وعلى هذا تُبنى الأصناف في محرّكات الألعاب، فالبيانات خاصّة، وأمامها دوال تتحقّق قبل أن تغيّر شيئًا.
المطلوب
أكمل صنف Inventory، وهو حقيبة لاعب فيها عدد محدود من الخانات، تُنشأ بـ Inventory bag(3)، وتصير سعتها صفرًا إذا كانت السعة المعطاة سالبة. واجعل bool add(const std::string& item) تضيف العنصر وتُرجع true إذا بقي مكان، وإلا تُرجع false ولا تضيف شيئًا. وتُرجع bool has(const std::string& item) const هل العنصر في الحقيبة، وint count() const عدد ما فيها، وint capacity() const سعتها. وتبقى البيانات في capacity_ وitems_ خاصّة.
الفحوص
5 فحوص- الحقيبة الجديدة فارغة وسعتها صحيحة
- الدالة add تضيف وتُرجع true، والدالة has تجد ما أُضيف
- الدالة add ترفض حين تمتلئ الحقيبة ولا تتجاوز السعة
- السعة السالبة تصير صفرًا فلا يدخل شيء
- الدالة has تُرجع false لما لم يُضف إلى الحقيبة