Mengirim Fungsi sebagai Argumen
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C di Coddy. Pelajaran 36 dari 61.
Salah satu penggunaan pointer fungsi yang paling ampuh adalah meneruskannya sebagai argumen ke fungsi lain. Dengan begitu, kamu dapat menyisipkan perilaku khusus ke dalam fungsi tanpa mengubah kodenya. Teknik ini terkadang disebut callback.
Pertimbangkan sebuah fungsi yang melakukan perhitungan pada dua angka. Daripada menuliskan operasi secara langsung, kamu dapat menerima pointer fungsi yang menentukan operasi yang harus dilakukan:
typedef int (*Operation)(int, int);
int compute(int a, int b, Operation op) {
return op(a, b);
}Fungsi compute tidak tahu apakah fungsi itu sedang menjumlahkan, mengurangkan, atau melakukan hal lain sepenuhnya. Fungsi itu hanya memanggil fungsi apa pun yang diteruskan kepadanya:
int add(int a, int b) { return a + b; }
int multiply(int a, int b) { return a * b; }
int main() {
printf("%d\n", compute(5, 3, add)); // output: 8
printf("%d\n", compute(5, 3, multiply)); // output: 15
return 0;
}Perhatikan bagaimana fungsi compute yang sama menghasilkan hasil berbeda berdasarkan fungsi yang kita berikan. Pola ini penting untuk menulis kode yang fleksibel dan dapat digunakan kembali. Kamu menulis strukturnya sekali, lalu pengguna fungsimu memberikan logika khusus yang mereka perlukan.
Tantangan
MudahTulis fungsi apply_twice yang menerima dua bilangan bulat dan kode operasi, menerapkan operasi tersebut pada angka-angka itu dua kali secara berurutan, lalu mengembalikan hasil akhirnya.
Fungsimu akan menerima kode operasi yang menentukan operasi yang digunakan. Kamu harus mendefinisikan fungsi-fungsi operasi di dalam solusimu dan meneruskannya ke fungsi pembantu compute yang menerima pointer fungsi.
Catatan: hanya fungsi yang diperlukan. Tes akan memanggil apply_twice secara langsung dan memeriksa nilai kembaliannya, jadi jangan membaca input atau mencetak apa pun.
Struktur yang diperlukan:
- Definisikan sebuah
typedefbernamaOperationuntuk pointer fungsi yang menerima dua parameterintdan mengembalikanint - Definisikan dua fungsi operasi:
add(mengembalikan a + b) danmultiply(mengembalikan a * b) - Definisikan fungsi
computeyang menerima dua bilangan bulat dan pointer fungsiOperation, lalu mengembalikan hasil pemanggilan operasi tersebut - Di dalam
apply_twice, pilih operasi yang sesuai berdasarkan kode, lalu gunakancomputedua kali: pertama dengan angka-angka awal, lalu dengan hasil dan angka kedua lagi
Logika:
- Pilih fungsi operasi berdasarkan
op_code(1 = add, 2 = multiply) - Panggil
compute(a, b, operation)untuk mendapatkan hasil sementara - Panggil
compute(intermediate, b, operation)untuk mendapatkan hasil akhir - Kembalikan hasil akhir
Parameter:
a(int): Angka pertamab(int): Angka keduaop_code(int): Kode operasi (1 untuk add, 2 untuk multiply)
Nilai kembali: Hasil setelah operasi diterapkan dua kali secara berurutan (int)
Contoh: Dengan a = 5, b = 3, op_code = 1 (add):
- Perhitungan pertama: 5 + 3 = 8
- Perhitungan kedua: 8 + 3 = 11
- Kembalikan: 11
Dengan a = 2, b = 4, op_code = 2 (multiply):
- Perhitungan pertama: 2 × 4 = 8
- Perhitungan kedua: 8 × 4 = 32
- Kembalikan: 32
Coba sendiri
int apply_twice(int a, int b, int op_code) {
// Tulis kodemu di sini
}
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 Rahasia7Pointer Fungsi
Mendeklarasikan Pointer FungsiMemanggil Pointer FungsiTypedef untuk Pointer FungsiMengirim Fungsi sebagai ArgumenRangkuman: Dispatch Kalkulator2Object 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