Menu
CoddyTech

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 sempurna

Teknik 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.

challenge icon

Tantangan

Mudah

Mari 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. Struct Animal milikmu harus memiliki satu field: legs (integer yang menunjukkan jumlah kaki). Struct Dog milikmu harus menyematkan Animal sebagai anggota pertama dan menambahkan field name (array karakter berisi 50 karakter). Deklarasikan juga fungsi print_animal yang menerima parameter Animal*.
  • animal.c: Implementasikan fungsi print_animal. Fungsi ini bekerja dengan tipe dasar. Fungsi ini hanya mengetahui Animal dan mencetak jumlah kaki yang dimiliki hewan tersebut.
  • main.c: Buat variabel Dog dan isi field-field-nya (kaki milik animal yang disematkan dan nama anjing). Lalu, tunjukkan aturan anggota pertama dengan melakukan cast pada Dog* milikmu menjadi Animal* dan meneruskannya ke print_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: 4

Di 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;
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler C online