Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Mari 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 bernama NotifyFunc yang menerima parameter const char* dan tidak mengembalikan apa pun. Lalu definisikan struct Notifier yang berisi name (sebuah const char*) dan pointer fungsi notify bertipe NotifyFunc.
  • main.c: Sertakan header-mu dan implementasikan dua fungsi notifikasi:
    • alert_notify: mencetak pesan dengan format: [ALERT] message
    • info_notify: mencetak pesan dengan format: [INFO] message
    Lalu buat instance 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 starting

Contoh output ketika jenisnya 2 dan pesannya "All systems normal":

[INFO] All systems normal

Ingat 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;
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler C online