Menu
Coddy logo textTech

'Self' İşaretçisi

Coddy'nin C Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 7 / 61.

Python veya Java gibi nesne yönelimli dillerde object.method() çağrıldığında, dil nesnenin kendisini yönteme otomatik olarak iletir. C dilinde bunu, yapıya bir işaretçiyi ilk bağımsız değişken olarak ileterek manuel olarak yapmalıyız.

Bu işaretçi geleneksel olarak self (Python'dan ödünç alınmıştır) veya this (C++'tan) olarak adlandırılır. İşlevin yapının verilerine erişmesini sağlayarak bu verileri okumasına veya değiştirmesine olanak tanır:

typedef struct {
    int health;
} Player;

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

self işaretçisi, işlevin bir yöntem gibi davranmasını sağlar. Hangi oyuncunun değiştirileceğini bilir. Bu işaretçi olmadan işlevin belirli yapı örneğine erişmesinin bir yolu olmazdı. Bu işlevi çağırırken yapınızın adresini iletirsiniz:

Player hero = {100};
player_take_damage(&hero, 25);
// hero.health artık 75

Değişiklik yapmak için işaretçi kullanmak (yapıyı doğrudan geçirmek yerine) çok önemlidir. Yapıyı değer yoluyla geçirirseniz işlev bir kopya alır ve yapılan tüm değişiklikler işlev geri döndüğünde kaybolur. İşaretçi, değişikliklerin özgün yapıda kalıcı olmasını sağlar.

challenge icon

Görev

Kolay

Geçen saniyeleri takip eden bir Timer modülü oluşturalım. Metot gibi davranan işlevler aracılığıyla bir yapının dahili durumunu değiştirmek için "self" işaretçisi desenini kullanma pratiği yapacaksın.

Üç dosya oluşturacaksın:

  • timer.h: Tek bir Timer üyesine sahip bir int seconds yapısı bildir. Ayrıca iki işlev bildir: timer_tick (Timer'a işaretçi alır ve belirtilen saniye sayısını ekler) ve timer_reset (Timer'a işaretçi alır ve seconds değerini sıfıra ayarlar). TIMER_H sembolüyle include guard'ları kullan.
  • timer.c: Her iki işlevi de uygula. timer_tick işlevi bir Timer *self ve bir int amount kabul etmeli, ardından amount değerini zamanlayıcının seconds değerine eklemeli. timer_reset işlevi bir Timer *self kabul etmeli ve seconds değerini sıfıra ayarlamalı.
  • main.c: Bir Timer oluştur, üzerinde işlemler gerçekleştir ve sonuçları görüntüle.

İki tamsayı girdisi alacaksın: zamanlayıcın için initial seconds ve tick aracılığıyla eklenecek amount.

main dosyanda:

  1. Bir Timer yapısını başlangıç saniye değeriyle başlat
  2. Belirtilen miktarı eklemek için timer_tick işlevini çağır
  3. Geçerli saniye değerini yazdır
  4. Zamanlayıcıyı sıfırlamak için timer_reset işlevini çağır
  5. Saniye değerini tekrar yazdır (0 olmalı)

Sonuçları şu biçimde yazdır:

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

Örneğin, başlangıç değeri 30 ve eklenen saniye sayısı 15 olduğunda çıktı şöyle olur:

After tick: 45
After reset: 0

Kendin dene

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

int main() {
    int initial_seconds, amount_to_add;
    scanf("%d", &initial_seconds);
    scanf("%d", &amount_to_add);
    
    // TODO: Bir Timer oluştur ve initial_seconds ile başlat
    
    // TODO: amount_to_add saniye eklemek için timer_tick çağır
    
    // TODO: Mevcut saniyeleri şu formatta yazdır: "After tick: {seconds}"
    
    // TODO: Zamanlayıcıyı sıfırlamak için timer_reset çağır
    
    // TODO: Saniyeleri tekrar şu formatta yazdır: "After reset: {seconds}"
    
    return 0;
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online C derleyicisi