Aturan Anggota Pertama
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C di Coddy. Pelajaran 29 dari 61.
Ketika kamu menyematkan struct sebagai anggota pertama dari struct lain, sesuatu yang hebat terjadi: alamat memori struct luar sama dengan alamat memori anggota pertamanya. Hal ini dijamin oleh standar C.
Pertimbangkan contoh kita sebelumnya:
typedef struct {
int id;
} Parent;
typedef struct {
Parent parent; // Anggota pertama
int grade;
} Child;Saat kamu membuat variabel Child, member Parent berada tepat di awal memori Child. Artinya, pointer ke Child menunjuk ke alamat yang sama persis dengan pointer ke member Parent-nya.
Child c;
Child* child_ptr = &c;
Parent* parent_ptr = (Parent*)child_ptr; // Konversi tipe yang aman!Kedua pointer menyimpan alamat yang sama. Ini memungkinkan kamu meneruskan Child* ke fungsi apa pun yang mengharapkan Parent*:
void print_id(Parent* p) {
printf("ID: %d\n", p->id);
}
// Di main:
Child c;
c.parent.id = 42;
print_id((Parent*)&c); // Berfungsi dengan sempurnaTeknik ini adalah dasar pewarisan di C. Fungsi yang ditulis untuk tipe dasar dapat beroperasi pada tipe turunan apa pun, asalkan tipe dasar disematkan terlebih dahulu. Cast ini aman karena tata letak memorinya sejajar dengan sempurna.
Tantangan
MudahMari kita pelajari aturan anggota pertama dengan membangun hierarki hewan sederhana. Kamu akan membuat struct dasar Animal dan struct turunan Dog, lalu menunjukkan bagaimana pointer ke Dog dapat di-cast dengan aman menjadi pointer ke Animal.
Wawasan utama yang akan kamu terapkan: ketika Animal menjadi anggota pertama dari Dog, kedua struct memiliki alamat memori awal yang sama. Artinya, kamu dapat meneruskan Dog* ke fungsi mana pun yang mengharapkan Animal* dengan melakukan cast pada pointer tersebut.
Kamu akan mengatur kodemu dalam tiga file:
animal.h: Definisikan kedua struct dengan include guard. StructAnimalmilikmu harus memiliki satu field:legs(integer yang menunjukkan jumlah kaki). StructDogmilikmu harus menyematkanAnimalsebagai anggota pertama dan menambahkan fieldname(array karakter berisi 50 karakter). Deklarasikan juga fungsiprint_animalyang menerima parameterAnimal*.animal.c: Implementasikan fungsiprint_animal. Fungsi ini bekerja dengan tipe dasar. Fungsi ini hanya mengetahuiAnimaldan mencetak jumlah kaki yang dimiliki hewan tersebut.main.c: Buat variabelDogdan isi field-field-nya (kaki milik animal yang disematkan dan nama anjing). Lalu, tunjukkan aturan anggota pertama dengan melakukan cast padaDog*milikmu menjadiAnimal*dan meneruskannya keprint_animal. Cetak juga nama anjing secara terpisah untuk menunjukkan gambaran lengkapnya.
Kamu akan menerima dua input: nama anjing (string) dan jumlah kaki (integer).
Output-mu seharusnya terlihat seperti ini:
Dog: Buddy
Legs: 4Di sini, Buddy adalah nama anjing dan 4 adalah jumlah kakinya. Cetak nama anjing terlebih dahulu dari main.c, lalu panggil print_animal dengan pointer hasil cast untuk menampilkan jumlah kakinya.
Ini menunjukkan bagaimana fungsi yang ditulis untuk tipe dasar (Animal) dapat bekerja dengan lancar dengan tipe turunan (Dog) melalui cast pointer: dasar dari pewarisan di C.
Coba sendiri
#include <stdio.h>
#include <string.h>
#include "animal.h"
int main() {
// Baca input
char name[50];
int legs;
scanf("%s", name);
scanf("%d", &legs);
// TODO: Buat variabel Dog
// TODO: Atur nama anjing menggunakan strcpy
// TODO: Atur jumlah kaki (akses melalui Animal yang tertanam)
// TODO: Cetak nama anjing dalam format: "Dog: <name>"
// TODO: Lakukan cast dari Dog* ke Animal* dan panggil print_animal
// Ini menunjukkan aturan anggota pertama!
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