Menu
Coddy logo textTech

Üst Üyelere Erişim

Coddy'nin C Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 30 / 61.

Artık yapı gömmeyi ve ilk üye kuralını anladığımıza göre, pratik kısma odaklanalım: gömülü üst öğenin verileri bir işlevin içinden nasıl okunur ve değiştirilir?

Bir işlev bir Child yapısı (veya ona yönelik bir işaretçi) aldığında, üst yapının üyelerine erişmek için gömülü yapı üzerinden ilerlemek gerekir. Sözdizimi, bir değerle mi yoksa bir işaretçiyle mi çalıştığınıza bağlıdır.

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

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

Child türüne bir işaretçi ile ok operatörünü kullanarak üst öğeye, ardından nokta operatörünü kullanarak üyelerine erişin:

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

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

Bir değer (kopya yoluyla geçirilir) ile her yerde noktaları kullanın:

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

Bu zincirlenmiş erişim deseni olan child->parent.member veya child.parent.member, C'nin bileşim modelindeki miras alınan verilerle etkileşim kurma yöntemidir. Gerçek kalıtımdan biraz daha ayrıntılıdır, ancak türler arasındaki ilişkiyi açık ve net bir şekilde ortaya koyar.

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 alt yapı üzerinden üst yapının verileriyle çalışan işlevler yazacaksın.

Kodunu üç dosyaya ayıracaksın:

  • student.h: Include guard'larıyla struct hiyerarşini tanımla. Person (50 karakterlik bir karakter dizisi) ve name (bir tamsayı) alanlarına sahip bir age struct'ı oluştur. Ardından, ilk üyesi olarak Student içeren ve bir Person alanı (öğrencinin puanını temsil eden bir tamsayı) ekleyen bir grade struct'ı tanımla. set_person_age ve yeni bir yaş değeri alan Student* ile print_student alan ve tüm bilgileri görüntüleyen Student* olmak üzere iki işlev bildir.
  • student.c: Her iki işlevi de uygula. set_person_age işlevin, gömülü Person struct'ının içindeki yaşı değiştirmeli. Ok-ardından-nokta söz dizimini (s->person.age) burada uygulayacaksın. print_student işlevin, hem gömülü person'dan hem de öğrencinin kendisinden tüm alanlara erişmeli ve bunları görüntülemeli.
  • main.c: Bir Student değişkeni oluştur ve tüm alanlarını başlat. Ardından, gömülü person'ın yaşını güncellemek için set_person_age işlevini kullan ve sonucu görüntülemek için print_student işlevini çağır.

Dört girdi alacaksın: öğrencinin adı (bir string), başlangıç yaşı (bir tamsayı), notu (bir tamsayı) ve yeni yaşı (işlevin aracılığıyla güncellenecek bir tamsayı).

main dosyanda öğrenciyi başlangıç değerleriyle oluştur, ardından yaşı yeni değere değiştirmek için set_person_age işlevini çağır ve son olarak güncellenmiş bilgileri görüntülemek için print_student işlevini çağır.

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

Name: Emma
Age: 21
Grade: 85

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

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ı 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ı başlat
    // - name'i gömülü kişinin name'ine strcpy kullanarak kopyala
    // - Gömülü kişinin age'ini initial_age olarak ayarla
    // - Öğrencinin grade'ini ayarla
    
    // TODO: Yaşı new_age olarak güncellemek için set_person_age'i çağır
    
    // TODO: Sonucu görüntülemek için print_student'i ç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.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online C derleyicisi