ملخص: الصندوق السري
جزء من قسم Object Oriented Programming في رحلة C على Coddy — الدرس 21 من 61.
التحدي
سهللنقم ببناء وحدة Box توضح مفهوم التغليف (encapsulation) الكامل. سيكون لصندوقك ثلاثة أبعاد مخفية — العرض (width)، والارتفاع (height)، والعمق (depth) — والتي لا يمكن الوصول إليها إلا من خلال الدوال التي توفرها. هذا هو نمط المؤشر غير الشفاف (opaque pointer pattern) الكامل قيد التنفيذ!
ستقوم بإنشاء ثلاثة ملفات:
box.h: واجهتك العامة. صرّح عن نوعBoxغير شفاف باستخدام إعلان مسبق (forward declaration) فقط — يظل جسم الهيكل (struct) مخفيًا. صرّح عن هذه الدوال:create_box— تأخذ ثلاثة أعداد صحيحة (width، height، depth) وتعيد مؤشر Box.destroy_box— تحرر الذاكرة المخصصة.get_volume— تأخذconst Box *وتعيد الحجم (width × height × depth).set_dimensions— تأخذ مؤشر Box وثلاث قيم أبعاد جديدة، وتعيدint(1 للنجاح، 0 إذا كان أي بُعد سالبًا أو صفرًا).
BOX_H.box.c: عرّفstruct Boxالفعلي مع ثلاثة أعضاء مخفيين:int width، وint height، وint depth. قم بتنفيذ الدوال الأربع جميعها. يجب أن يقوم منشئ الكائن (constructor) بتخصيص الذاكرة وتهيئة الصندوق. يجب أن تتحقق دالةset_dimensionsمن أن القيم الثلاث جميعها موجبة (أكبر من الصفر) قبل تطبيق التغييرات — إذا فشلت أي قيمة في التحقق، فارفض التحديث بالكامل وأعد 0.main.c: استعرض صندوقك المغلف عن طريق إنشاء واحد، والتحقق من حجمه، ومحاولة تغيير الأبعاد (سواء كانت صالحة أو غير صالحة)، والتنظيف بشكل صحيح.
ستتلقى خمسة مدخلات: العرض الأولي، الارتفاع الأولي، العمق الأولي، تليها ثلاثة أبعاد جديدة لمحاولة تعيينها (والتي قد تتضمن قيمًا غير صالحة).
في ملفك الرئيسي، أنشئ Box بالأبعاد الأولية واطبع حجمه. ثم حاول تعيين الأبعاد الجديدة — اطبع ما إذا كان التحديث قد نجح والحجم الناتج. أخيرًا، قم بتحرير الصندوق وأكد عملية التنظيف.
اطبع المخرجات بهذا التنسيق:
Volume: {volume}
Set: {0 or 1}
Volume: {volume}
Destroyedعلى سبيل المثال، مع المدخلات 2، 3، 4، 5، 5، 5، ستكون المخرجات:
Volume: 24
Set: 1
Volume: 125
Destroyedمع المدخلات 2، 3، 4، -1، 5، 5، ستكون المخرجات:
Volume: 24
Set: 0
Volume: 24
Destroyedلاحظ كيف يحمي التحقق في set_dimensions صندوقك من الحالات غير الصالحة — لا يمكن للكود الخارجي تجاوز قواعدك لأن الأبعاد مخفية تمامًا خلف واجهتك.
جرّب بنفسك
#include <stdio.h>
#include "box.h"
int main() {
// قراءة الأبعاد الأولية
int width, height, depth;
scanf("%d", &width);
scanf("%d", &height);
scanf("%d", &depth);
// قراءة الأبعاد الجديدة للمحاولة
int new_w, new_h, new_d;
scanf("%d", &new_w);
scanf("%d", &new_h);
scanf("%d", &new_d);
// TODO: إنشاء صندوق بالأبعاد الأولية
// TODO: طباعة الحجم الأولي بالتنسيق: "Volume: {volume}"
// TODO: محاولة تعيين أبعاد جديدة وتخزين النتيجة
// TODO: طباعة ما إذا كان التعيين قد نجح بالتنسيق: "Set: {0 or 1}"
// TODO: طباعة الحجم الناتج بالتنسيق: "Volume: {volume}"
// TODO: تدمير الصندوق وطباعة "Destroyed"
return 0;
}
جميع دروس Object Oriented Programming
1أساسيات البرمجة التركيبية
ملفات الترويسةحواجز التضمينملفات المصدرالدوال الساكنةمراجعة: آلة حاسبة تركيبية4التغليف (Encapsulation)
مفهوم الـ Opaque Pointersتعريف الـ Opaque Structsالـ Getters والـ Settersالتحقق من البيانات في الـ Settersملخص: الصندوق السري2الكائنات والأساليب
الـ Structs ككائناتمؤشر 'Self'صحة استخدام Constالمؤشر مقابل القيمةالأساليب المساعدةملخص: Point Manager5مشروع: حساب بنكي بسيط
إعداد المشروعتنفيذ الحساب3دورة حياة الكائن
نمط المنشئ (Constructor Pattern)نمط الهادم (Destructor Pattern)تهيئة الـ Stackالنسخ العميق (Deep Copy)مراجعة: String Wrapper6الوراثة عبر التركيب
تضمين الـ Structقاعدة العضو الأولالوصول إلى أعضاء الأبعملية الـ Upcastingمراجعة: هرمية الأشكال9مشروع: رسّام الأشكال
نظرة عامة على المشروعتنفيذ الدائرة