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.
Görev
KolayOpak 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 birTimertü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) vefree_timer(bir Timer pointer alır ve temizleme işlemini yapar).TIMER_Hsimgesiyle include guard kullan.timer.c: Gizli kısım burada bulunur. İki gizli member içeren gerçekstruct Timeryapısını tanımla:int secondsveint running(running için 1, stopped için 0 kullan). Yapıyı allocate eden,secondsdeğerini provided değerle Initialize eden verunningdeğ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 freedBuradaki 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;
}
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