Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

الـ 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.

challenge icon

التحدي

سهل

لنقم ببناء وحدة 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;
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Object Oriented Programming