الـ Structs ككائنات
جزء من قسم Object Oriented Programming في رحلة C على Coddy — الدرس 6 من 61.
في اللغات كائنية التوجه، يعد الـ object (الكائن) كيانًا يجمع البيانات (state) مع الدوال التي تعمل على تلك البيانات (methods). لا تحتوي لغة C على كائنات مدمجة، ولكن يمكننا تحقيق المفهوم نفسه باستخدام الـ structs والـ functions.
فكر في الـ struct كجزء "البيانات" من الكائن. فهو يحمل الحالة (state) — القيم التي تحدد ماهية الكائن حاليًا:
typedef struct {
int value;
} Counter;
يمثل الـ Counter struct كيانًا يحتوي على جزء واحد من الحالة: قيمته الحالية. ولإعطائه سلوكًا، نقوم بكتابة دوال تقبل الـ struct كمعامل:
void counter_increment(Counter *c) {
c->value++;
}
int counter_get(Counter *c) {
return c->value;
}
تعمل هذه الدوال مثل الميثودات (methods)—فهي تعمل خصيصاً على بيانات Counter. من خلال تمرير الـ struct إلى الدوال، نحن نحاكي ما تفعله اللغات الأخرى تلقائياً عندما تستدعي counter.increment().
int main() {
Counter my_counter = {0};
counter_increment(&my_counter);
printf("%d\n", counter_get(&my_counter)); // يطبع: 1
return 0;
}
تساعد اتفاقية التسمية typename_action (مثل counter_increment) في تنظيم الكود الخاص بك وتوضح أي struct تنتمي إليها الدالة. هذا النمط هو أساس البرمجة كائنية التوجه في لغة C.
التحدي
سهللنقم ببناء وحدة Counter بسيطة تتعامل مع هيكل (struct) ككائن له سلوك. ستقوم بتنظيم الكود الخاص بك عبر ثلاثة ملفات لممارسة نمط تجميع البيانات مع الدوال التي تعمل عليها.
ستقوم بإنشاء ثلاثة ملفات:
counter.h: ملف الترويسة الخاص بك الذي يعلن عن هيكلCounterمع عضو واحدint value. أعلن أيضًا عن دالتين تعملان كـ "طرق" (methods) للعداد:counter_increment(تأخذ مؤشرًا إلى Counter وتزيد قيمته بمقدار 1) وcounter_get(تأخذ مؤشرًا إلى Counter وتعيد قيمته الحالية). استخدم حراس التضمين (include guards) مع الرمزCOUNTER_H.counter.c: ملف المصدر الخاص بك الذي يقوم بتنفيذ كلتا الدالتين. تذكر تضمين ملف الترويسة الخاص بك.main.c: ملفك الرئيسي الذي ينشئ Counter، ويجري عمليات عليه، ويعرض النتائج.
ستتلقى مدخلين من نوع عدد صحيح: القيمة الابتدائية لعدادك و عدد المرات لزيادته.
في ملفك الرئيسي، قم بتهيئة Counter بالقيمة الابتدائية، ثم استدعِ counter_increment لعدد المرات المحدد. أخيرًا، استخدم counter_get لاسترداد وطباعة القيمة النهائية.
اطبع النتيجة بهذا التنسيق:
Final value: {result}على سبيل المثال، مع قيمة ابتدائية قدرها 5 و 3 زيادات، سيكون الناتج:
Final value: 8ورقة مرجعية
في لغة C، يمكننا محاكاة البرمجة كائنية التوجه من خلال دمج الهياكل (structs - البيانات) مع الدوال (السلوك) التي تعمل على تلك الهياكل.
قم بتعريف هيكل (struct) للاحتفاظ بالحالة:
typedef struct {
int value;
} Counter;
قم بإنشاء دوال تعمل كـ "طرق" (methods) من خلال قبول الهيكل كمعامل:
void counter_increment(Counter *c) {
c->value++;
}
int counter_get(Counter *c) {
return c->value;
}
استخدم الهيكل والدوال معاً:
Counter my_counter = {0};
counter_increment(&my_counter);
printf("%d\n", counter_get(&my_counter)); // يطبع: 1
تساعد اتفاقية التسمية typename_action (على سبيل المثال، counter_increment) في تنظيم الكود وتوضيح الهيكل الذي تعمل عليه الدالة.
جرّب بنفسك
#include <stdio.h>
#include "counter.h"
int main() {
// قراءة المدخلات
int starting_value;
int num_increments;
scanf("%d", &starting_value);
scanf("%d", &num_increments);
// TODO: إنشاء Counter وتهيئته بـ starting_value
// TODO: استدعاء counter_increment لعدد المرات المحدد
// TODO: استخدام counter_get لاسترجاع القيمة النهائية وطباعتها
// صيغة الطباعة: "Final value: {result}"
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مشروع: رسّام الأشكال
نظرة عامة على المشروعتنفيذ الدائرة