Opaque Pointer Kavramı
Coddy'nin C Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 17 / 61.
Şu ana kadar, bir başlık dosyasında bir struct tanımladığımızda, o başlığı dahil eden herkes tüm üyeleri görebilir ve onlara doğrudan erişebilir. Bu durum, dahili detayları dış koddan gizleme prensibi olan kapsüllemeyi (encapsulation) bozar.
C, bunu çözmek için opak işaretçiler (opaque pointers) adı verilen güçlü bir teknik sunar. Fikir basittir: Bir struct'ın başlık dosyasında var olduğunu bildirin, ancak içinde ne olduğunu açıklamayın. Bu, bir tamamlanmamış tür (incomplete type) kullanılarak yapılır:
// wallet.h
typedef struct Wallet Wallet; // Sadece bildirim - gövde yok!
Wallet *create_wallet(int initial_balance);
void free_wallet(Wallet *w);
Süslü parantezlerin olmadığına dikkat edin; Wallet'ın ne içerdiğini asla tanımlamayız. Derleyici türün var olduğunu bilir, ancak boyutunu veya üyelerini bilmez. Bu, bu başlık dosyasını içeren kodun yalnızca Wallet işaretçileriyle çalışabileceği, asla struct'ın kendisiyle doğrudan çalışamayacağı anlamına gelir.
Bu neden önemlidir? Asıl struct tanımı .c dosyasında gizli kaldığı için, başlık dosyanızı kullanan hiçbir kod w->balance veya sizeof(Wallet) yazamaz. Sizin sağladığınız fonksiyonları kullanmak zorundadırlar. Veriye olan tüm erişimi siz kontrol edersiniz ve başlık dosyanıza bağımlı olan hiçbir kodu bozmadan dahili yapıyı daha sonra değiştirebilirsiniz.
Bir sonraki derste, kaynak dosyası içinde gerçek struct gövdesini tanımlayarak opak işaretçi (opaque pointer) desenini tamamlama pratiği yapacaksınız.
Kopya kağıdı
Bir opak işaretçi (opaque pointer), struct uygulama detaylarını gizlemek için tamamlanmamış bir tür (incomplete type) kullanarak kapsüllemeyi zorunlu kılar.
Struct'ı, gövdesini tanımlamadan başlık dosyasında bildirin:
// wallet.h
typedef struct Wallet Wallet; // Sadece bildirim - süslü parantez yok
Wallet *create_wallet(int initial_balance);
void free_wallet(Wallet *w);
Derleyici türün var olduğunu bilir ancak boyutunu veya üyelerini bilmez. Kullanıcılar yalnızca struct'a yönelik işaretçilerle çalışabilir ve onunla etkileşime geçmek için sağlanan fonksiyonları kullanmalıdır.
Gerçek struct tanımı .c dosyasına yerleştirilir; bu da w->balance gibi doğrudan üye erişimini veya sizeof(Wallet) kullanımını engeller.
Kendin dene
Bu ders bir kod alıştırması içermiyor.
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Object Oriented Programming 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şisi