Ü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.
Görev
KolayGö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) vename(bir tamsayı) alanlarına sahip biragestruct'ı oluştur. Ardından, ilk üyesi olarakStudentiçeren ve birPersonalanı (öğrencinin puanını temsil eden bir tamsayı) ekleyen birgradestruct'ı tanımla.set_person_ageve yeni bir yaş değeri alanStudent*ileprint_studentalan ve tüm bilgileri görüntüleyenStudent*olmak üzere iki işlev bildir.student.c: Her iki işlevi de uygula.set_person_ageişlevin, gömülüPersonstruct'ının içindeki yaşı değiştirmeli. Ok-ardından-nokta söz dizimini (s->person.age) burada uygulayacaksın.print_studentişlevin, hem gömülü person'dan hem de öğrencinin kendisinden tüm alanlara erişmeli ve bunları görüntülemeli.main.c: BirStudentdeğişkeni oluştur ve tüm alanlarını başlat. Ardından, gömülü person'ın yaşını güncellemek içinset_person_ageişlevini kullan ve sonucu görüntülemek içinprint_studentiş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: 85Burada 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;
}
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
1Modüler Programlama Temelleri
Başlık DosyalarıInclude Guard'larKaynak DosyalarıStatik FonksiyonlarÖzet: Modüler Hesap Makinesi4Kapsülleme
Opaque Pointer KavramıOpaque Struct TanımlamaGetter ve Setter MetotlarıSetter Metotlarında DoğrulamaÖzet: Gizli Kutu2Nesneler ve Metotlar
Nesne Olarak Struct'lar'Self' İşaretçisiConst Doğruluğuİşaretçi vs DeğerYardımcı MetotlarÖzet: Point Manager5Proje: Basit Banka Hesabı
Proje KurulumuHesabın Oluşturulması3Nesne Yaşam Döngüsü
Constructor DeseniDestructor DeseniStack İlklendirmeDerin KopyalamaÖzet: String Wrapper6Kompozisyon Yoluyla Kalıtım
Struct Gömmeİlk Üye KuralıÜst Üyelere ErişimUpcastingÖzet: Şekil HiyerarşisiKendi başına pratik yap: Online C derleyicisi