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.
Tantangan
MudahMari 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 structTimerdengan satu memberint seconds. Deklarasikan juga dua fungsi:timer_tick(menerima pointer ke Timer dan menambahkan jumlah detik yang ditentukan) dantimer_reset(menerima pointer ke Timer dan mengatur kembali seconds ke nol). Gunakan include guard dengan simbolTIMER_H.timer.c: Implementasikan kedua fungsi. Fungsitimer_tickharus menerimaTimer *selfdanint amount, lalu menambahkan amount ke seconds pada timer. Fungsitimer_resetharus menerimaTimer *selfdan 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:
- Inisialisasi
Timerdengan nilai detik awal - Panggil
timer_tickuntuk menambahkan jumlah yang ditentukan - Cetak detik saat ini
- Panggil
timer_resetuntuk mengatur ulang timer - 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: 0Coba 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;
}
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 Akun3Siklus 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