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.
Görev
KolayOpak 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 birTimertü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) vefree_timer(bir Timer işaretçisi alır ve temizleme işlemini yapar).TIMER_Hsimgesini kullanarak include guard’ları ekle.timer.c: Sır burada gizli. İki gizli üyeye sahip gerçekstruct Timeryapısını tanımla:int secondsveint running(çalışıyorsa 1, durmuşsa 0 kullan). Yapıyı ayıran,secondsdeğerini verilen değerle başlatan verunningdeğ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 freedBuradaki 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;
}
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
1Modüler Programlama Temelleri
Başlık DosyalarıInclude Guard'larKaynak DosyalarıStatik FonksiyonlarÖzet: Modüler Hesap Makinesi4Kapsülleme
Opaque Pointer KavramıOpaque Struct TanımlamaGetter ve Setter MetotlarıSetter Metotlarında DoğrulamaÖzet: Gizli Kutu2Nesneler ve Metotlar
Nesne Olarak Struct'lar'Self' İşaretçisiConst Doğruluğuİşaretçi vs DeğerYardımcı MetotlarÖzet: Point Manager5Proje: Basit Banka Hesabı
Proje KurulumuHesabın Oluşturulması3Nesne Yaşam Döngüsü
Constructor DeseniDestructor DeseniStack İlklendirmeDerin KopyalamaÖzet: String Wrapper6Kompozisyon Yoluyla Kalıtım
Struct Gömmeİlk Üye KuralıÜst Üyelere ErişimUpcastingÖzet: Şekil HiyerarşisiKendi başına pratik yap: Online C derleyicisi