Menu
Coddy logo textTech

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ığınıza göre, kalıbı nasıl tamamlayacağımıza bakalım. Üstbilgi, bir türün var olduğunu bildirir, ancak kaynak dosyası gerçekte içinde ne olduğunu tanımladığınız yerdir.

İşte eksiksiz kurulum. Öncelikle, yalnızca ileri bildirim içeren başlık dosyası:

// counter.h
#ifndef COUNTER_H
#define COUNTER_H

typedef struct Counter Counter;  // Eksik tip

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

#endif

Ardından kaynak dosyası asıl struct tanımını içerir:

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

struct Counter {
    int value;      // Dışarıdan gizli!
    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);
}

Temel nokta: struct Counter { ... } yalnızca .c dosyasında görünür. counter.h dosyasını içeren herhangi bir dosya, Counter öğesinin var olduğunu bilir ancak value veya step öğelerini göremez. main.c içinde 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, getter ve setter işlevleri 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 dosyasının içinde gizlemeyi ve dahili members öğelerini modülünü kullanan tüm kodlar için tamamen görünmez hâle getirmeyi öğreneceksin.

Üç dosya oluşturacaksın:

  • timer.h: Bu, genel arayüzündür. Yalnızca bir ileri bildirim kullanarak opak bir Timer türü tanımla: burada struct gövdesi olmasın! Ayrıca iki function tanımla: create_timer (seconds için bir integer alır ve bir Timer pointer returns) ve free_timer (bir Timer pointer alır ve temizleme işlemini yapar). TIMER_H simgesiyle include guard kullan.
  • timer.c: Gizli kısım burada bulunur. İki gizli member içeren gerçek struct Timer yapısını tanımla: int seconds ve int running (running için 1, stopped için 0 kullan). Yapıyı allocate eden, seconds değerini provided değerle Initialize eden ve running değerini 1 olarak ayarlayan constructor'ını Implement et. Memory'yi free eden destructor'ı Implement et.
  • main.c: Bir timer oluşturmak ve başarıyla oluşturulduğunu doğrulamak için Timer modülünü kullan. Struct members gizli olduğundan bunlara doğrudan erişemezsin. Bütün mesele bu! Yalnızca oluşturmayı doğrulayan bir mesaj Print et, ardından timer'ı free et ve bir temizleme mesajı Print et.

Bir input alacaksın: timer'ı Initialize etmek için kullanılacak seconds sayısı (bir integer).

main dosyanda provided seconds değeriyle bir timer oluştur. Bir oluşturma mesajı Print et, ardından timer'ı free et ve bir doğrulama mesajı Print et.

Çıktıyı şu formatta Print et:

Timer created
Timer freed

Buradaki temel fikir, main.c dosyasının Timer pointer'larıyla çalışabilmesi, ancak seconds veya running değerlerine doğrudan erişmesinin hiçbir yolu olmamasıdır. main.c içinde t->seconds yazmaya çalışmak compiler error'a neden olur, çünkü struct body yalnızca timer.c içinde tanımlanmıştır. Bu, gerçek encapsulation'dır: Implement ayrıntıları modülünü kullanan kişilerden tamamen gizlenir.

Kendin dene

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

int main() {
    int seconds;
    scanf("%d", &seconds);
    
    // TODO: Sağlanan saniye değeriyle bir zamanlayıcı oluştur
    
    // TODO: Print "Timer created"
    
    // TODO: Zamanlayıcıyı 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