Menu
Coddy logo textTech

Üst Üyelere Erişim

Coddy'nin C Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 30 / 61.

Artık struct gömme (struct embedding) ve ilk üye kuralını (first member rule) anladığımıza göre, pratik tarafa odaklanalım: bir fonksiyon içinden gömülü üst öğenin (parent) verilerinin nasıl okunacağı ve değiştirileceği.

Bir fonksiyon bir Child struct'ı (veya ona işaret eden bir pointer) aldığında, üst öğenin (parent) üyelerine erişmek, gömülü struct üzerinden ilerlemeyi gerektirir. Sözdizimi, bir değerle mi yoksa bir pointer ile mi çalıştığınıza bağlıdır.

typedef struct {
    int id;
    int score;
} Parent;

typedef struct {
    Parent parent;
    char grade;
} Child;

Child için bir pointer (işaretçi) kullanarak, ebeveyne ulaşmak için ok operatörünü, ardından üyelerine erişmek için nokta operatörünü kullanın:

void update_score(Child* c, int new_score) {
    c->parent.score = new_score;  // Önce ok, sonra nokta
}

void print_info(Child* c) {
    printf("ID: %d, Score: %d\n", c->parent.id, c->parent.score);
}

Bir değer (kopya ile geçilen) ile her yerde nokta kullanın:

void show_id(Child c) {
    printf("ID: %d\n", c.parent.id);  // Nokta sonra nokta
}

Bu zincirleme erişim deseni — child->parent.member veya child.parent.member — C'nin kompozisyon modelinde kalıtılan verilerle bu şekilde etkileşim kurmanızı sağlar. Gerçek kalıtımdan biraz daha ayrıntılıdır, ancak türler arasındaki ilişki konusunda açık ve nettir.

challenge icon

Görev

Kolay

Gömülü bir struct içindeki verilere nasıl erişileceğini ve bu verilerin nasıl değiştirileceğini gösteren bir öğrenci notlandırma sistemi oluşturalım. Bir Student yapısının gömülü bir Person içerdiği bir hiyerarşi oluşturacak, ardından çocuk üzerinden ebeveynin verileriyle çalışan fonksiyonlar yazacaksınız.

Kodunuzu üç dosya halinde düzenleyeceksiniz:

  • student.h: Struct hiyerarşinizi include guard'lar ile tanımlayın. name (50 karakterlik bir karakter dizisi) ve age (bir tam sayı) içeren bir Person struct'ı oluşturun. Ardından, ilk üyesi olarak Person yapısını gömen ve bir grade alanı (puanlarını temsil eden bir tam sayı) ekleyen bir Student struct'ı tanımlayın. İki fonksiyon bildirin: Bir Student* ve yeni bir yaş değeri alan set_person_age ve bir Student* alıp tüm bilgileri görüntüleyen print_student.
  • student.c: Her iki fonksiyonu da uygulayın. set_person_age fonksiyonunuz, gömülü Person struct'ı içindeki yaşı değiştirmelidir; burası önce ok, sonra nokta sözdizimi (s->person.age) pratiği yapacağınız yerdir. print_student fonksiyonunuz hem gömülü kişiden hem de öğrencinin kendisinden tüm alanlara erişmeli ve bunları görüntülemelidir.
  • main.c: Bir Student değişkeni oluşturun ve tüm alanlarını başlatın. Ardından, gömülü kişinin yaşını güncellemek için set_person_age fonksiyonunu kullanın ve sonucu görüntülemek için print_student fonksiyonunu çağırın.

Dört girdi alacaksınız: öğrencinin adı (bir dize), başlangıç yaşı (bir tam sayı), notu (bir tam sayı) ve yeni yaşı (fonksiyonunuz aracılığıyla güncellenecek bir tam sayı).

Ana dosyanızda, öğrenciyi başlangıç değerleriyle oluşturun, ardından yaşı yeni değerle değiştirmek için set_person_age fonksiyonunu çağırın ve son olarak güncellenmiş bilgileri görüntülemek için print_student fonksiyonunu çağırın.

Çıktınız şu şekilde görünmelidir:

Name: Emma
Age: 21
Grade: 85

Burada Emma isim, 21 güncellenmiş yaş (başlangıç yaşı değil) ve 85 nottur. Buradaki temel öğrenim, ebeveynin üyelerini hem okumak hem de yazmak için gömülü struct içinde gezinmektir.

Kopya kağıdı

Bir fonksiyondan gömülü üst yapı (parent struct) üyelerine erişmek için, bir işaretçiyle mi yoksa bir değerle mi çalıştığınıza bağlı olan zincirleme erişim sözdizimini kullanın.

Alt yapıya (child struct) yönelik bir işaretçi ile, gömülü üst yapıya ulaşmak için ok operatörünü, ardından üyelerine erişmek için nokta notasyonunu kullanın:

void update_score(Child* c, int new_score) {
    c->parent.score = new_score;  // Önce ok sonra nokta
}

void print_info(Child* c) {
    printf("ID: %d, Score: %d\n", c->parent.id, c->parent.score);
}

Bir değer ile (kopyalanarak aktarılan), baştan sona nokta notasyonunu kullanın:

void show_id(Child c) {
    printf("ID: %d\n", c.parent.id);  // Önce nokta sonra nokta
}

Bu desen — child->parent.member veya child.parent.member — C'nin kompozisyon modelinde kalıtılan verilere açık erişim sağlar.

Kendin dene

#include <stdio.h>
#include <string.h>
#include "student.h"

int main() {
    char name[50];
    int initial_age, grade, new_age;
    
    // Girdileri oku
    fgets(name, 50, stdin);
    name[strcspn(name, "\n")] = '\0';  // Yeni satır karakterini kaldır
    scanf("%d", &initial_age);
    scanf("%d", &grade);
    scanf("%d", &new_age);
    
    // TODO: Bir Student değişkeni oluştur
    
    // TODO: Öğrencinin tüm alanlarını ilklendir
    // - strcpy kullanarak ismi gömülü person'ın ismine kopyala
    // - Gömülü person'ın yaşını initial_age olarak ayarla
    // - Öğrencinin notunu (grade) ayarla
    
    // TODO: Yaşı new_age olarak güncellemek için set_person_age fonksiyonunu çağır
    
    // TODO: Sonucu görüntülemek için print_student fonksiyonunu çağır
    
    return 0;
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Object Oriented Programming bölümündeki tüm dersler