Opaç türler
- C kursu
- Orta seviye
- Ders 109/116
- 5 dk
Opaç (opaque) türler ve bilgi gizleme öğrenirsin.
Opaç türler
Bir opaç tür (opaque type), iç yapısını kullanıcıdan gizleyen türdür. Başlık dosyasında yalnızca typedef struct Counter Counter; bildirimi olur; struct Counter'ın tanımı kaynak dosyasında gizli kalır.
Kullanıcı, Counter * işaretçisini tutar ama içeriğine erişemez. Yapıya yalnızca sağladığın fonksiyonlar (counter_new, counter_add, counter_get) üzerinden erişilir. Bu, C'de soyutlama sağlamanın temel yoludur. Kullanıcı iç yapıyı bilmediği için, sen yapıyı sonradan değiştirebilirsin; kullanıcı kodu bozulmaz. Bu desen, gerçek kütüphanelerde yaygındır; örneğin FILE türü opaktır.
Counter opak türü
Bir Counter opak türü, art arda çağrılarla değer biriktirir. Kullanıcı yalnızca üç fonksiyon görür: counter_new, counter_add ve counter_get.
Örnek kullanım: Counter *c = counter_new(); counter_add(c, 5); counter_add(c, 3); printf("%d\n", counter_get(c));. Çıktı 8 olur. Kullanıcı c->value yazamaz; çünkü struct Counter'ın tanımını göremez. Bu, güvenli bir arayüzdür: yalnızca izin verilen işlemler yapılabilir. Bu desen, C'de nesne yönelimli programlamanın karşılığıdır; veri ve onu işleyen fonksiyonlar bir arada paketlenmiştir.
Uygulama Opak Counter yaz
typedef struct Counter Counter; ile opak bildirimi yap. struct Counter { int value; }; tanımını ekle. Counter *counter_new(void), void counter_add(Counter *c, int n) ve int counter_get(Counter *c) fonksiyonlarını yaz. main içinde Counter *c = counter_new(); counter_add(c, 5); counter_add(c, 3); printf("%d\n", counter_get(c)); free(c); yaz.
Başlangıç kodu
#include <stdio.h>
#include <stdlib.h>
// Counter türünü opak olarak bildir
// counter_new, counter_add, counter_get fonksiyonlarını yaz
// main'de sayacı kullan ve yazdır
int main(void) {
return 0;
}Örnek çözüm
#include <stdio.h>
#include <stdlib.h>
typedef struct Counter Counter;
struct Counter { int value; };
Counter *counter_new(void) {
Counter *c = malloc(sizeof(Counter));
c->value = 0;
return c;
}
void counter_add(Counter *c, int n) {
c->value += n;
}
int counter_get(Counter *c) {
return c->value;
}
int main(void) {
Counter *c = counter_new();
counter_add(c, 5);
counter_add(c, 3);
printf("%d\n", counter_get(c));
free(c);
return 0;
}Beklenen çıktı
8
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Opaç türün avantajı nedir?
- İç yapı gizli kalır, sonra değiştirilebilir Doğru cevap
- Otomatik bellek yönetimi
- Daha az bellek kullanır
- Daha hızlı derlenir
Açıklama: Opaç tür iç yapıyı gizler; sonradan değiştirebilirsin ve kullanıcı kodu bozulmaz.
2 Counter fonksiyonlarını eşle
| Kavram | Anlamı |
|---|---|
counter_new |
Yeni sayaç |
counter_add |
Değer ekle |
counter_get |
Değer oku |
Counter * |
Opak işaretçi |
3 counter_add çağrısını tamamla
counter_add(c, ____);
counter_add(c, 5);
Açıklama: counter_add(c, 5); sayaca 5 ekler.