Struct'larda Fonksiyon İşaretçileri
Coddy'nin C Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 38 / 61.
Şimdiye kadar, işlev işaretçilerini bağımsız değişkenler olarak kullandık veya bunları bağımsız değişken olarak geçirdik. Çok biçimliliğe doğru bir sonraki adım, bir işlev işaretçisini doğrudan bir struct içine yerleştirerek struct’a kendi davranışını kazandırmaktır.
Bir yapı bir işlev işaretçisi içerdiğinde, her örnek farklı bir işlev tutabilir. Bu, aynı türdeki iki nesnenin işlev işaretçilerini çağırdığınızda farklı davranabileceği anlamına gelir:
typedef void (*PrintFunc)(const char*);
typedef struct {
const char* name;
PrintFunc print; // Üye olarak fonksiyon işaretçisi
} Printer;Printer yapısının artık iki üyesi var: veri (name) ve davranış (print). Kullanmak için başlatma sırasında bir işlevi işaretçiye atarsınız:
void loud_print(const char* msg) {
printf("!!! %s !!!\n", msg);
}
int main() {
Printer p;
p.name = "Alert";
p.print = loud_print;
p.print("Hello"); // Çıktı: !!! Hello !!!
return 0;
}Fonksiyonu struct üzerinden nasıl çağırdığımıza dikkat edin: p.print("Hello"). Bu, diğer dillerde bir nesne üzerinde metot çağırmaya oldukça benzer. Struct, hem verilerini hem de bu veriler üzerinde işlem yapan fonksiyonu taşır.
Bu kalıp, C dilindeki çok biçimliliğin temelidir: farklı örneklere farklı işlevler atanabilir ve aynı yapı türünden farklı davranışlar elde edilebilir.
Görev
Kolayİşaretçiler aracılığıyla yapıların kendi davranışlarını nasıl taşıyabildiğini gösteren bir Notifier sistemi oluşturalım.
Kodunuzu düzenlemek için iki dosya oluşturacaksınız:
notifier.h:NotifyFuncparametresi alan ve hiçbir şey döndürmeyenconst char*adlı bir işaretçi türü tanımlayın. Ardından birNotifier(name) veconst char*türünde birnotifyişlev işaretçisi içeren birNotifyFuncyapısı tanımlayın.main.c: Başlık dosyanızı dahil edin ve iki bildirim işlevi uygulayın:alert_notify: mesajı şu biçimde yazdırır:[ALERT] messageinfo_notify: mesajı şu biçimde yazdırır:[INFO] message
Notifierörneği oluşturun, girdiye göre uygun işlevi bağlayın ve bildirimi yapının işlev işaretçisi aracılığıyla çağırın.
Programınız iki girdi alacak: bir bildirim türü (uyarı için 1, bilgi için 2) ve görüntülenecek bir mesaj.
Türe göre karşılık gelen işlevi notifier'ınızın notify üyesine atayın, ardından mesajı görüntülemek için onu yapı üzerinden çağırın.
Tür 1 ve mesaj "System starting" olduğunda örnek çıktı:
[ALERT] System startingTür 2 ve mesaj "All systems normal" olduğunda örnek çıktı:
[INFO] All systems normalBaşlık dosyanızda include guard kullanmayı ve işlevi yapı üyesi üzerinden çağırmayı unutmayın: n.notify(message)
Kendin dene
#include <stdio.h>
#include "notifier.h"
// TODO: alert_notify fonksiyonunu uygula
// Şunu yazdırmalı: [ALERT] message
// TODO: info_notify fonksiyonunu uygula
// Şunu yazdırmalı: [INFO] message
int main() {
int type;
char message[256];
// Girdiyi oku
scanf("%d", &type);
getchar(); // yeni satırı tüket
fgets(message, sizeof(message), stdin);
// Varsa message'dan sondaki yeni satırı kaldır
int len = 0;
while (message[len] != '\0') len++;
if (len > 0 && message[len-1] == '\n') message[len-1] = '\0';
// TODO: Bir Notifier örneği oluştur
// TODO: type'a göre (1 alert için, 2 info için),
// uygun fonksiyonu notifier'ın notify üyesine ata
// TODO: Bildirimi struct'ın fonksiyon işaretçisi üzerinden çağır
// Kullan: n.notify(message)
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ı8Polimorfizm
Struct'larda Fonksiyon İşaretçileriMetotları Simüle EtmeArayüz KavramıArayüzleri UygulamaPolimorfik İterasyonÖzet: Greeter3Nesne 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