Pola Konstruktor
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C di Coddy. Pelajaran 12 dari 61.
Dalam bahasa seperti Java atau C++, kamu membuat object menggunakan konstruktor: fungsi khusus yang secara otomatis mengalokasikan memori dan menginisialisasi field. C tidak memiliki fitur seperti itu, tetapi kita bisa menyimulasikannya dengan pola sederhana: fungsi create_.
Fungsi konstruktor dalam C biasanya melakukan tiga hal: mengalokasikan memori dengan malloc, menginisialisasi semua field dengan nilai yang tepat, dan mengembalikan pointer ke object baru:
typedef struct {
char *name;
int age;
} Person;
Person *create_person(const char *name, int age) {
Person *p = malloc(sizeof(Person));
p->name = malloc(strlen(name) + 1);
strcpy(p->name, name);
p->age = age;
return p;
}
Fungsi mengembalikan pointer karena object berada di heap, bukan di stack. Ini berarti object tetap ada setelah fungsi selesai dan dapat diteruskan dengan bebas. Pemanggil menggunakannya seperti ini:
Person *alice = create_person("Alice", 30);
printf("%s is %d years old\n", alice->name, alice->age);
Perhatikan bagaimana constructor menangani semua detail yang rumit: mengalokasikan struct, mengalokasikan ruang untuk string, dan menyalin data. Pemanggil hanya memberikan nilai awal dan menerima object yang siap digunakan. Ini merangkum logika pembuatan di satu tempat, sehingga kodemu lebih rapi dan lebih sedikit rentan terhadap error.
Tantangan
MudahMari buat module Book yang menggunakan pola constructor untuk membuat object buku di heap. Kamu akan berlatih menulis fungsi create_ yang menangani semua alokasi dan inisialisasi memori, lalu mengembalikan pointer yang siap digunakan.
Kamu akan membuat tiga file:
book.h: Deklarasikan structBookdengan dua anggota:char *title(pointer ke string yang dialokasikan secara dinamis) danint pages. Deklarasikan juga fungsi constructorcreate_bookyang menerima string judul dan jumlah halaman, lalu mengembalikan pointer ke Book yang baru dibuat. Gunakan include guard dengan simbolBOOK_H.book.c: Implementasikan fungsicreate_book. Constructor-mu harus mengalokasikan memori untuk struct Book itu sendiri, lalu mengalokasikan memori terpisah untuk string judul (ingat untuk memperhitungkan null terminator), menyalin judul ke memori baru, mengatur field pages, lalu mengembalikan pointer ke Book yang baru dibuat.main.c: Gunakan constructor-mu untuk membuat buku dan menampilkan informasinya.
Kamu akan menerima dua input: judul buku (sebuah string) dan jumlah halaman (sebuah bilangan bulat).
Di file main-mu, gunakan create_book untuk membuat buku baru dengan nilai yang diberikan, lalu cetak informasinya dengan format ini:
Title: {title}
Pages: {pages}Misalnya, dengan input The C Programming Language dan 272, output-nya adalah:
Title: The C Programming Language
Pages: 272Ingat bahwa constructor-mu merangkum semua logika pembuatan: pemanggil cukup memberikan nilai awal dan menerima object yang sudah diinisialisasi sepenuhnya dan siap digunakan.
Coba sendiri
#include <stdio.h>
#include <stdlib.h>
#include "book.h"
int main() {
char title[256];
int pages;
// Baca input
fgets(title, sizeof(title), stdin);
// Hapus karakter baris baru jika ada
for (int i = 0; title[i]; i++) {
if (title[i] == '\n') {
title[i] = '\0';
break;
}
}
scanf("%d", &pages);
// TODO: Gunakan create_book untuk membuat buku baru dengan nilai yang diberikan
// TODO: Tampilkan informasi buku dalam format yang diminta:
// Judul: {title}
// Halaman: {pages}
// TODO: Jangan lupa bebaskan memori yang dialokasikan setelah selesai
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