Pointer Fungsi dalam Struct
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C di Coddy. Pelajaran 38 dari 61.
Sampai sekarang, kita telah menggunakan pointer fungsi sebagai variabel mandiri atau meneruskannya sebagai argumen. Langkah selanjutnya menuju polimorfisme adalah menyematkan pointer fungsi langsung di dalam struct, sehingga struct memiliki perilaku sendiri.
Ketika sebuah struct berisi pointer fungsi, setiap instance dapat menyimpan fungsi yang berbeda. Artinya, dua object dengan tipe yang sama dapat berperilaku berbeda saat kamu memanggil pointer fungsi mereka:
typedef void (*PrintFunc)(const char*);
typedef struct {
const char* name;
PrintFunc print; // Pointer fungsi sebagai anggota
} Printer;struct Printer kini memiliki dua anggota: data (name) dan perilaku (print). Untuk menggunakannya, kamu menetapkan sebuah fungsi ke pointer saat inisialisasi:
void loud_print(const char* msg) {
printf("!!! %s !!!\n", msg);
}
int main() {
Printer p;
p.name = "Alert";
p.print = loud_print;
p.print("Hello"); // output: !!! Hello !!!
return 0;
}Perhatikan bahwa kita memanggil fungsi melalui struct: p.print("Hello"). Ini terlihat sangat mirip dengan memanggil method pada object dalam bahasa lain. Struct menyimpan data dan fungsi yang mengoperasikannya.
Pola ini adalah dasar polimorfisme dalam C: setiap instance dapat memiliki fungsi yang berbeda, sehingga menghasilkan perilaku yang berbeda dari tipe struct yang sama.
Tantangan
MudahMari kita buat sistem Notifier yang menunjukkan bagaimana struct dapat membawa perilakunya sendiri melalui pointer fungsi.
Kamu akan membuat dua file untuk mengatur kodemu:
notifier.h: Definisikan tipe pointer fungsi bernamaNotifyFuncyang menerima parameterconst char*dan tidak mengembalikan apa pun. Lalu definisikan structNotifieryang berisiname(sebuahconst char*) dan pointer fungsinotifybertipeNotifyFunc.main.c: Sertakan header-mu dan implementasikan dua fungsi notifikasi:alert_notify: mencetak pesan dengan format:[ALERT] messageinfo_notify: mencetak pesan dengan format:[INFO] message
Notifier, hubungkan fungsi yang sesuai berdasarkan input, dan panggil notifikasi melalui pointer fungsi pada struct.
Programmu akan menerima dua input: jenis notifikasi (1 untuk alert, 2 untuk info) dan pesan yang akan ditampilkan.
Berdasarkan jenisnya, tetapkan fungsi yang sesuai ke member notify pada notifier-mu, lalu panggil melalui struct untuk menampilkan pesan.
Contoh output ketika jenisnya 1 dan pesannya "System starting":
[ALERT] System startingContoh output ketika jenisnya 2 dan pesannya "All systems normal":
[INFO] All systems normalIngat untuk menggunakan include guard di file header-mu, dan panggil fungsi melalui member struct: n.notify(message)
Coba sendiri
#include <stdio.h>
#include "notifier.h"
// TODO: Implementasikan fungsi alert_notify
// Harus mencetak: [ALERT] message
// TODO: Implementasikan fungsi info_notify
// Harus mencetak: [INFO] message
int main() {
int type;
char message[256];
// Baca input
scanf("%d", &type);
getchar(); // Baca karakter newline
fgets(message, sizeof(message), stdin);
// Hapus karakter newline di akhir message jika ada
int len = 0;
while (message[len] != '\0') len++;
if (len > 0 && message[len-1] == '\n') message[len-1] = '\0';
// TODO: Buat instance Notifier
// TODO: Berdasarkan type (1 untuk alert, 2 untuk info),
// tetapkan fungsi yang sesuai ke anggota notify milik notifier
// TODO: Panggil notifikasi melalui pointer fungsi milik struct
// Gunakan: n.notify(message)
return 0;
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar Pemrograman Modular
file headerProteksi includefile sumberFungsi StatisRingkasan: Kalkulator Modular4Enkapsulasi
Konsep Opaque PointerMendefinisikan Opaque StructGetter dan SetterValidasi pada SetterUlasan: Kotak Rahasia2Object dan method
Struct sebagai objectPointer 'self'Konsistensi constPointer vs nilaiMethod pembantuRangkuman: Pengelola Point5Proyek: Akun Bank Sederhana
Penyiapan ProyekImplementasi Akun8Polimorfisme
Pointer Fungsi dalam StructMensimulasikan methodKonsep InterfaceMengimplementasikan InterfaceIterasi PolimorfikUlasan: Greeter3Siklus Hidup object
Pola KonstruktorPola DestruktorInisialisasi StackSalinan MendalamRangkuman: Pembungkus string6Pewarisan melalui Komposisi
Penyematan StructAturan Anggota PertamaMengakses Anggota ParentUpcastingRekap: Hierarki Bentuk9Proyek: Penggambar Bentuk
Ringkasan ProyekImplementasi LingkaranImplementasi Persegi PanjangPenggunaan PolimorfismeWadah BentukLatihan sendiri: Compiler C online