Menu
Coddy logo textTech

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.

quiz iconKendini test et

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