Mendefinisikan Opaque Struct
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C di Coddy. Pelajaran 18 dari 61.
Sekarang setelah kamu memahami konsep pointer opaque, mari lihat cara melengkapi pola ini. Header mendeklarasikan bahwa suatu tipe ada, tetapi file sumber adalah tempat kamu mendefinisikan isi sebenarnya.
Berikut setup lengkapnya. Pertama, header yang hanya berisi deklarasi awal:
// counter.h
#ifndef COUNTER_H
#define COUNTER_H
typedef struct Counter Counter; // Tipe tidak lengkap
Counter *create_counter(int start);
void free_counter(Counter *c);
#endif
Lalu, file sumber berisi definisi struct yang sebenarnya:
// counter.c
#include "counter.h"
#include <stdlib.h>
struct Counter {
int value; // Tersembunyi dari luar!
int step;
};
Counter *create_counter(int start) {
Counter *c = malloc(sizeof(Counter));
c->value = start;
c->step = 1;
return c;
}
void free_counter(Counter *c) {
free(c);
}
Poin utama: struct Counter { ... } hanya muncul di file .c. File apa pun yang menyertakan counter.h tahu bahwa Counter ada, tetapi tidak bisa melihat value atau step. Mencoba menulis c->value di main.c akan menyebabkan error compiler: anggota-anggota tersebut benar-benar tidak terlihat.
Pemisahan ini adalah dasar enkapsulasi dalam C. Langkah berikutnya adalah menyediakan akses terkontrol melalui fungsi getter dan setter.
Tantangan
MudahMari buat module Timer yang mendemonstrasikan pola pointer opak. Kamu akan berlatih menyembunyikan definisi struct di dalam file sumber, sehingga anggota internalnya sama sekali tidak terlihat oleh kode yang menggunakan module-mu.
Kamu akan membuat tiga file:
timer.h: Ini adalah antarmuka publikmu. Deklarasikan tipeTimeropak hanya dengan deklarasi awal: jangan tulis isi struct di sini! Deklarasikan juga dua fungsi:create_timer(menerima bilangan bulat untuk jumlah detik dan mengembalikan pointer Timer) danfree_timer(menerima pointer Timer dan membersihkan sumber daya). Gunakan include guard dengan simbolTIMER_H.timer.c: Di sinilah bagian rahasianya. Definisikanstruct Timeryang sebenarnya dengan dua anggota tersembunyi:int secondsdanint running(gunakan 1 untuk berjalan, 0 untuk berhenti). Implementasikan constructor untuk mengalokasikan struct, menginisialisasisecondsdengan nilai yang diberikan, dan mengaturrunningke 1. Implementasikan destructor untuk membebaskan memori.main.c: Gunakan module Timer-mu untuk membuat timer dan memastikan timer berhasil dibuat. Karena anggota struct disembunyikan, kamu tidak dapat mengaksesnya secara langsung. Inilah tujuannya! Cukup cetak pesan yang mengonfirmasi pembuatan, lalu bebaskan timer dan cetak pesan pembersihan.
Kamu akan menerima satu input: jumlah detik (bilangan bulat) untuk menginisialisasi timer.
Di file utamamu, buat timer dengan nilai detik yang diberikan. Cetak pesan pembuatan, lalu bebaskan timer dan cetak konfirmasi.
Cetak output dalam format ini:
Timer created
Timer freedHal penting yang perlu dipahami adalah main.c dapat menggunakan pointer Timer, tetapi tidak memiliki cara untuk mengakses seconds atau running secara langsung. Mencoba menulis t->seconds di main.c akan menyebabkan error compiler karena isi struct hanya didefinisikan di timer.c. Inilah enkapsulasi yang sesungguhnya: detail implementasi sepenuhnya tersembunyi dari pengguna module-mu.
Coba sendiri
#include <stdio.h>
#include "timer.h"
int main() {
int seconds;
scanf("%d", &seconds);
// TODO: Buat timer dengan nilai detik yang diberikan
// TODO: Cetak "Timer created"
// TODO: Bebaskan memori timer
// TODO: Cetak "Timer freed"
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