Menu
CoddyTech

Pointer 'self'

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C di Coddy. Pelajaran 7 dari 61.

Dalam bahasa berorientasi object seperti Python atau Java, saat kamu memanggil object.method(), bahasa tersebut secara otomatis meneruskan object itu sendiri ke method. Dalam C, kita harus melakukannya secara manual dengan meneruskan pointer ke struct sebagai argumen pertama.

Pointer ini biasanya diberi nama self (dipinjam dari Python) atau this (dari C++). Pointer ini memberi fungsi akses ke data struct agar fungsi dapat membaca atau mengubahnya:

typedef struct {
    int health;
} Player;

void player_take_damage(Player *self, int amount) {
    self->health -= amount;
}

Pointer self membuat fungsi bertindak seperti method. Pointer ini mengetahui pemain mana yang harus diubah. Tanpanya, fungsi tidak akan memiliki cara untuk mengakses instance struct tertentu. Saat memanggil fungsi ini, kamu meneruskan alamat struct-mu:

Player hero = {100};
player_take_damage(&hero, 25);
// hero.health sekarang bernilai 75

Menggunakan pointer (alih-alih mengirimkan struct secara langsung) sangat penting untuk melakukan perubahan. Jika kamu mengirimkan struct berdasarkan nilai, fungsi akan menerima salinan, dan semua perubahan akan hilang saat fungsi selesai. Pointer memastikan perubahan tetap ada pada struct asli.

challenge icon

Tantangan

Mudah

Mari buat module Timer yang melacak detik yang telah berlalu. Kamu akan berlatih menggunakan pola pointer "self" untuk mengubah state internal struct melalui fungsi yang bertindak sebagai method.

Kamu akan membuat tiga file:

  • timer.h: Deklarasikan struct Timer dengan satu member int seconds. Deklarasikan juga dua fungsi: timer_tick (menerima pointer ke Timer dan menambahkan jumlah detik yang ditentukan) dan timer_reset (menerima pointer ke Timer dan mengatur kembali seconds ke nol). Gunakan include guard dengan simbol TIMER_H.
  • timer.c: Implementasikan kedua fungsi. Fungsi timer_tick harus menerima Timer *self dan int amount, lalu menambahkan amount ke seconds pada timer. Fungsi timer_reset harus menerima Timer *self dan mengatur seconds-nya ke nol.
  • main.c: Buat Timer, lakukan operasi padanya, lalu tampilkan hasilnya.

Kamu akan menerima dua input bilangan bulat: detik awal untuk timer dan jumlah yang ditambahkan melalui tick.

Di file main-mu:

  1. Inisialisasi Timer dengan nilai detik awal
  2. Panggil timer_tick untuk menambahkan jumlah yang ditentukan
  3. Cetak detik saat ini
  4. Panggil timer_reset untuk mengatur ulang timer
  5. Cetak detiknya lagi (seharusnya 0)

Cetak hasilnya dengan format berikut:

After tick: {seconds}
After reset: {seconds}

Contohnya, dengan nilai awal 30 dan menambahkan 15 detik, output-nya adalah:

After tick: 45
After reset: 0

Coba sendiri

#include <stdio.h>
#include "timer.h"

int main() {
    int initial_seconds, amount_to_add;
    scanf("%d", &initial_seconds);
    scanf("%d", &amount_to_add);
    
    // TODO: Buat Timer dan inisialisasi dengan initial_seconds
    
    // TODO: Panggil timer_tick untuk menambahkan amount_to_add detik
    
    // TODO: Cetak jumlah detik saat ini dengan format: "After tick: {seconds}"
    
    // TODO: Panggil timer_reset untuk mengatur ulang timer
    
    // TODO: Cetak jumlah detik lagi dengan format: "After reset: {seconds}"
    
    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