Mendefinisikan Opaque Struct
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C di Coddy. Pelajaran 18 dari 61.
Setelah memahami konsep pointer opak, sekarang mari kita lihat cara melengkapi pola ini. Header menyatakan 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 belum 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 utamanya: struct Counter { ... } hanya muncul di file .c. File apa pun yang menyertakan counter.h tahu bahwa Counter ada, tetapi tidak dapat melihat value atau step. Jika kamu mencoba menulis c->value di main.c, compiler akan menampilkan error: anggota-anggota tersebut benar-benar tidak terlihat.
Pemisahan ini adalah dasar enkapsulasi dalam C. Langkah berikutnya adalah menyediakan akses yang terkontrol melalui fungsi getter dan setter.
Tantangan
MudahMari kita buat module Timer yang menunjukkan pola pointer opak. Kamu akan berlatih menyembunyikan definisi struct di dalam file sumber, sehingga anggotanya sepenuhnya tidak terlihat oleh kode apa pun yang menggunakan module-mu.
Kamu akan membuat tiga file:
timer.h: Ini adalah antarmuka publikmu. Deklarasikan tipeTimeropak hanya dengan deklarasi awal, tanpa isi struct di sini! Deklarasikan juga dua fungsi:create_timer(menerima bilangan bulat untuk detik dan mengembalikan pointer Timer) danfree_timer(menerima pointer Timer dan membersihkan sumber daya). Gunakan penjaga include dengan simbolTIMER_H.timer.c: Di sinilah bagian rahasianya berada. Definisikanstruct Timeryang sebenarnya dengan dua anggota tersembunyi:int secondsdanint running(gunakan 1 untuk berjalan, 0 untuk berhenti). Implementasikan konstruktor untuk mengalokasikan struct, menginisialisasisecondsdengan nilai yang diberikan, dan menetapkanrunningke 1. Implementasikan destruktor 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. Memang itulah 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