Menu
CoddyTech

Opaque Struct Tanımlama

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

Artık opak işaretçiler kavramını anladığına göre, bu kalıbı nasıl tamamlayacağımıza bakalım. Başlık dosyası bir türün var olduğunu bildirir, ancak gerçekte içinde ne olduğunu tanımladığın yer kaynak dosyasıdır.

İşte eksiksiz kurulum. İlk olarak, yalnızca ileri bildirimin bulunduğu başlık:

// counter.h
#ifndef COUNTER_H
#define COUNTER_H

typedef struct Counter Counter;  // Tamamlanmamış tür

Counter *create_counter(int start);
void free_counter(Counter *c);

#endif

Ardından kaynak dosyası, gerçek struct tanımını içerir:

// counter.c
#include "counter.h"
#include <stdlib.h>

struct Counter {
    int value;      // Dışarıdan erişilemez!
    int step;
};

Counter *create_counter(int start) {
    Counter *c = malloc(sizeof(Counter));
    c->value = start;
    c->step = 1;
    return c;
}

void free_counter(Counter *c) {
    free(c);
}

Önemli nokta: struct Counter { ... } yalnızca .c dosyasında yer alır. counter.h dosyasını içeren herhangi bir dosya, Counter yapısının var olduğunu bilir ancak value veya step üyelerini göremez. main.c dosyasında c->value yazmaya çalışmak derleyici hatasına neden olur: üyeler gerçekten görünmezdir.

Bu ayrım, C'de kapsüllemenin temelidir. Sonraki adım, alıcı ve ayarlayıcı işlevler aracılığıyla kontrollü erişim sağlamaktır.

challenge icon

Görev

Kolay

Opak işaretçi desenini gösteren bir Timer modülü oluşturalım. Yapı tanımını kaynak dosyanın içinde gizlemeyi ve modülünü kullanan kodların iç üyelerini tamamen görünmez kılmayı öğreneceksin.

Üç dosya oluşturacaksın:

  • timer.h: Bu, herkese açık arayüzündür. Yalnızca bir ileri bildirim kullanarak opak bir Timer türü tanımla: burada yapı gövdesi olmayacak! Ayrıca iki işlev bildir: create_timer (saniye sayısı için bir tamsayı alır ve bir Timer işaretçisi döndürür) ve free_timer (bir Timer işaretçisi alır ve temizleme işlemini yapar). TIMER_H simgesini kullanarak include guard’ları ekle.
  • timer.c: Sır burada gizli. İki gizli üyeye sahip gerçek struct Timer yapısını tanımla: int seconds ve int running (çalışıyorsa 1, durmuşsa 0 kullan). Yapıyı ayıran, seconds değerini verilen değerle başlatan ve running değerini 1 yapan kurucunu uygula. Belleği serbest bırakan yıkıcıyı uygula.
  • main.c: Bir zamanlayıcı oluşturmak ve başarıyla oluşturulduğunu doğrulamak için Timer modülünü kullan. Yapı üyeleri gizli olduğundan onlara doğrudan erişemezsin. Amaç da tam olarak bu! Yalnızca oluşturulduğunu doğrulayan bir mesaj yazdır, ardından zamanlayıcıyı serbest bırak ve bir temizleme mesajı yazdır.

Bir girdi alacaksın: zamanlayıcıyı başlatmak için kullanılacak saniye sayısı (bir tamsayı).

Ana dosyanda verilen saniye değeriyle bir zamanlayıcı oluştur. Bir oluşturma mesajı yazdır, ardından zamanlayıcıyı serbest bırak ve onay mesajı yazdır.

Çıktıyı şu biçimde yazdır:

Timer created
Timer freed

Buradaki temel fikir, main.c dosyasının Timer işaretçileriyle çalışabilmesi, ancak seconds veya running üyelerine doğrudan erişememesidir. main.c içinde t->seconds yazmaya çalışmak derleyici hatasına yol açar; çünkü yapı gövdesi yalnızca timer.c içinde tanımlıdır. Bu, gerçek kapsüllemedir: uygulama ayrıntıları, modülünü kullananlardan tamamen gizlenir.

Kendin dene

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

int main() {
    int seconds;
    scanf("%d", &seconds);
    
    // TODO: Verilen saniye değeriyle bir zamanlayıcı oluştur
    
    // TODO: "Timer created" yazdır
    
    // TODO: Zamanlayıcının belleğini serbest bırak
    
    // TODO: "Timer freed" yazdır
    
    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