Mengakses Anggota Parent
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C di Coddy. Pelajaran 30 dari 61.
Sekarang setelah kita memahami penyisipan struct dan aturan anggota pertama, mari kita fokus pada penerapannya: cara membaca dan mengubah data induk yang disisipkan dari dalam fungsi.
Saat sebuah fungsi menerima struct Child (atau pointer ke struct tersebut), untuk mengakses anggota dari induknya, kamu perlu menelusuri struct yang disematkan. Sintaksnya bergantung pada apakah kamu menggunakan nilai atau pointer.
typedef struct {
int id;
int score;
} Parent;
typedef struct {
Parent parent;
char grade;
} Child;Dengan pointer ke Child, gunakan operator panah untuk mencapai parent, lalu titik untuk mengakses anggotanya:
void update_score(Child* c, int new_score) {
c->parent.score = new_score; // Panah lalu titik
}
void print_info(Child* c) {
printf("ID: %d, Score: %d\n", c->parent.id, c->parent.score);
}Dengan nilai (diteruskan melalui salinan), gunakan titik di seluruh bagian:
void show_id(Child c) {
printf("ID: %d\n", c.parent.id); // Titik lalu titik
}Pola akses berantai ini, child->parent.member atau child.parent.member, adalah cara kamu berinteraksi dengan data yang diwariskan dalam model komposisi C. Pola ini sedikit lebih panjang daripada pewarisan sejati, tetapi hubungannya antar tipe dinyatakan secara eksplisit dan jelas.
Tantangan
MudahMari buat sistem penilaian siswa yang menunjukkan cara mengakses dan mengubah data di dalam struct yang disematkan. Kamu akan membuat hierarki dengan Student yang berisi Person tertanam, lalu menulis fungsi yang bekerja dengan data induk melalui data anak.
Kamu akan mengatur kodemu dalam tiga file:
student.h: Definisikan hierarki struct dengan include guard. Buat structPersondenganname(array karakter sepanjang 50 karakter) danage(bilangan bulat). Lalu definisikan structStudentyang menyematkanPersonsebagai anggota pertama dan menambahkan fieldgrade(bilangan bulat yang mewakili nilai mereka). Deklarasikan dua fungsi:set_person_ageyang menerimaStudent*dan nilai usia baru, sertaprint_studentyang menerimaStudent*dan menampilkan semua informasi.student.c: Implementasikan kedua fungsi. Fungsiset_person_age-mu harus mengubah usia di dalam structPersonyang disematkan. Di sini kamu akan berlatih sintaks panah-lalu-titik (s->person.age). Fungsiprint_student-mu harus mengakses dan menampilkan semua field dari person yang disematkan dan student itu sendiri.main.c: Buat variabelStudentdan inisialisasi semua field-nya. Lalu gunakanset_person_ageuntuk memperbarui usia person yang disematkan, dan panggilprint_studentuntuk menampilkan hasilnya.
Kamu akan menerima empat input: name siswa (sebuah string), initial age-nya (bilangan bulat), grade-nya (bilangan bulat), dan new age (bilangan bulat untuk memperbarui usia melalui fungsimu).
Di file utamamu, buat student dengan nilai awal, lalu panggil set_person_age untuk mengubah usia ke nilai baru, dan terakhir panggil print_student untuk menampilkan informasi yang diperbarui.
Output-mu seharusnya terlihat seperti ini:
Name: Emma
Age: 21
Grade: 85Di sini, Emma adalah nama, 21 adalah usia yang diperbarui (bukan usia awal), dan 85 adalah nilainya. Hal penting yang dipelajari di sini adalah menelusuri struct yang disematkan untuk membaca dan menulis anggota milik data induk.
Coba sendiri
#include <stdio.h>
#include <string.h>
#include "student.h"
int main() {
char name[50];
int initial_age, grade, new_age;
// Baca input
fgets(name, 50, stdin);
name[strcspn(name, "\n")] = '\0'; // Hapus karakter baris baru
scanf("%d", &initial_age);
scanf("%d", &grade);
scanf("%d", &new_age);
// TODO: Buat variabel Student
// TODO: Inisialisasi semua field student
// - Salin name ke nama person yang tertanam menggunakan strcpy
// - Atur usia person yang tertanam ke initial_age
// - Atur grade student
// TODO: Panggil set_person_age untuk memperbarui usia menjadi new_age
// TODO: Panggil print_student untuk menampilkan hasilnya
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