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

مؤشر 'Self'

جزء من قسم البرمجة كائنية التوجه في رحلة C على Coddy. الدرس 7 من 61.

في اللغات كائنية التوجه مثل Python أو Java، عندما تستدعي object.method()، تمرر اللغة الكائن نفسه تلقائيًا إلى الطريقة. أما في C، فعلينا القيام بذلك يدويًا عبر تمرير مؤشر إلى البنية باعتباره الوسيط الأول.

يُسمّى هذا المؤشر تقليديًا self (مقتبسًا من Python) أو this (من C++). ويمنح function إمكانية الوصول إلى بيانات struct حتى تتمكن من قراءتها أو تعديلها:

typedef struct {
    int health;
} Player;

void player_take_damage(Player *self, int amount) {
    self->health -= amount;
}

مؤشر self هو ما يجعل function تتصرف كأنها method. فهي تعرف أيّ player يجب تعديلها. ومن دونها، لن تكون لدى function أي وسيلة للوصول إلى مثيل struct المحدد. عند استدعاء هذه function، تمرّر عنوان struct الخاص بك:

Player hero = {100};
player_take_damage(&hero, 25);
// hero.health أصبح الآن 75

يُعد استخدام pointer (بدلاً من تمرير struct مباشرةً) أمرًا ضروريًا لإجراء التعديل. إذا مرّرت struct بالقيمة، فستتلقى function نسخةً منه، وستُفقد أي تغييرات عند عودة function. يضمن pointer استمرار التغييرات في struct الأصلي.

challenge icon

التحدي

سهل

لنبنِ وحدة Timer تتتبّع عدد seconds المنقضية. ستتدرّب على using نمط المؤشر "self" لتعديل الحالة الداخلية لـ struct من خلال functions تعمل كطرائق.

ستنشئ ثلاثة ملفات:

  • timer.h: Declare بنية Timer ذات member واحد من النوع int seconds. Declare أيضًا دالتين: timer_tick (takes مؤشرًا إلى Timer ويضيف عددًا محددًا من seconds) وtimer_reset (takes مؤشرًا إلى Timer ويعيد seconds إلى zero). استخدم include guards بالرمز TIMER_H.
  • timer.c: Implement كلتا الدالتين. يجب أن تقبل دالة timer_tick قيمة Timer *self وint amount، ثم تضيف amount إلى seconds الخاص بالمؤقت. يجب أن تقبل دالة timer_reset قيمة Timer *self وتضبط seconds الخاص به على zero.
  • main.c: أنشئ Timer، ونفّذ عمليات عليه، واعرض النتائج.

ستتلقى مُدخلين صحيحين: initial seconds للمؤقت وamount المراد إضافته عبر tick.

في ملفك الرئيسي:

  1. هيّئ Timer بقيمة initial seconds
  2. استدعِ timer_tick لإضافة amount المحدد
  3. اطبع seconds الحالية
  4. استدعِ timer_reset لإعادة ضبط المؤقت
  5. اطبع seconds مرة أخرى (should تكون 0)

اطبع النتائج بهذا التنسيق:

After tick: {seconds}
After reset: {seconds}

على سبيل المثال، مع قيمة أولية قدرها 30 وإضافة 15 seconds، سيكون الناتج:

After tick: 45
After reset: 0

جرّب بنفسك

#include <stdio.h>
#include "timer.h"

int main() {
    int initial_seconds, amount_to_add;
    scanf("%d", &initial_seconds);
    scanf("%d", &amount_to_add);
    
    // TODO: أنشئ Timer وقم بتهيئته باستخدام initial_seconds
    
    // TODO: استدعِ timer_tick لإضافة amount_to_add ثانية
    
    // TODO: اطبع الثواني الحالية بالتنسيق: "After tick: {seconds}"
    
    // TODO: استدعِ timer_reset لإعادة تعيين المؤقت
    
    // TODO: اطبع الثواني مرة أخرى بالتنسيق: "After reset: {seconds}"
    
    return 0;
}
quiz iconاختبر نفسك

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

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم C عبر الإنترنت