ملخص: الصندوق السري
جزء من قسم البرمجة كائنية التوجه في رحلة C على Coddy. الدرس 21 من 61.
التحدي
سهللنبنِ وحدة Box توضّح التغليف الكامل. سيحتوي الصندوق على ثلاثة أبعاد مخفية، هي width وheight وdepth، ولا يمكن الوصول إليها إلا من خلال الدوال التي توفرها. هذا هو نمط المؤشر المعتم الكامل قيد التنفيذ!
ستنشىء ثلاثة ملفات:
box.h: واجهتك العامة. Declare نوعBoxمعتمًا باستخدام forward declaration فقط: يظل جسم البنية مخفيًا. Declare هذه الدوال:create_box: تأخذ ثلاثة أعداد صحيحة (width وheight وdepth) وتعيد مؤشرًا إلى Boxdestroy_box: تحرر الذاكرة allocatedget_volume: تأخذconst Box *وتعيد الحجم (width × height × depth)set_dimensions: تأخذ مؤشرًا إلى Box وثلاث قيم dimensions جديدة، وتعيدint(1 عند النجاح، و0 إذا كانت أي dimension سالبة أو تساوي صفرًا)
BOX_H.box.c: Define البنيةstruct Boxالفعلية مع ثلاثة أعضاء مخفية:int widthوint heightوint depth. Implement الدوال الأربع all. يجب أن يقوم constructor بتخصيص الصندوق وتهيئته. يجب أن تتحقق الدالةset_dimensionsمن أن القيم الثلاث all موجبة (greater than zero) قبل تطبيق التغييرات؛ وإذا فشلت أي قيمة في التحقق، فارفض التحديث entire وأعد 0.main.c: اعرض كيفية استخدام Box المغلف من خلال إنشاء واحد، والتحقق من حجمه، ومحاولة تغيير dimensions (سواء الصالحة أو غير الصالحة)، ثم إجراء التنظيف بصورة صحيحة.
ستتلقى خمسة مدخلات: initial width وinitial height وinitial depth، متبوعةً بـ three new dimensions لمحاولة تعيينها (وقد تتضمن قيمًا غير صالحة).
في ملف main، أنشئ Box باستخدام dimensions الأولية واطبع حجمه. ثم حاول تعيين dimensions الجديدة: اطبع ما إذا كان التحديث قد نجح، واطبع الحجم الناتج. وأخيرًا، حرر الصندوق وأكّد إتمام التنظيف.
اطبع الناتج بهذا التنسيق:
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 صندوقك من الحالات غير الصالحة: لا يمكن للكود الخارجي تجاوز قواعدك، لأن 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: أنشئ Box بالأبعاد الأولية
// TODO: اطبع الحجم الأولي بالصيغة: "Volume: {volume}"
// TODO: حاول تعيين الأبعاد الجديدة واحفظ النتيجة
// TODO: اطبع ما إذا نجح التعيين بالصيغة: "Set: {0 or 1}"
// TODO: اطبع الحجم الناتج بالصيغة: "Volume: {volume}"
// TODO: دمّر الصندوق واطبع "Destroyed"
return 0;
}
جميع دروس البرمجة كائنية التوجه
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مشروع: رسّام الأشكال
نظرة عامة على المشروعتنفيذ الدائرةتنفيذ المستطيلاستخدام تعدد الأشكالحاوية الأشكالتدرّب بنفسك: مترجم C عبر الإنترنت