Struct Gömme
Coddy'nin C Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 28 / 61.
C++ veya Java gibi nesne yönelimli dillerde kalıtım, bir sınıfın üst sınıftan özellikler edinmesini sağlar. C dilinde yerleşik kalıtım yoktur, ancak bileşim adı verilen bir teknik kullanarak bunu taklit edebiliriz: bir struct'ı başka bir struct'ın içine yerleştirmek.
Fikir basit: Bir Child için bir Parent'ın tüm özellikleri gerekiyorsa, Parent yapısını Child'ın bir üyesi olarak gömeriz.
typedef struct {
int id;
char name[50];
} Parent;
typedef struct {
Parent parent; // Gömülü struct
int grade;
} Child;Burada Child, Parent’ın sahip olduğu her şeyi ve ayrıca kendi grade alanını içerir. Bu bileşimdir: alt öğe, üst öğe "olur" yerine bir üst öğeye "sahiptir", ancak etkisi kalıtıma benzer.
Bir alt örneği aracılığıyla üst sınıfın üyelerine erişmek için nokta operatörünü iki kez kullanırsınız:
Child c;
c.parent.id = 101;
c.parent.name[0] = 'A';
c.grade = 5;Bu örüntü, C'de tür hiyerarşileri oluşturmanın temelini oluşturur. Bir temel yapıyı ilk üye olarak gömerek, gelecek derslerde inceleyeceğimiz güçlü tekniklerin önünü açarız.
Görev
KolayHadi C'de kalıtımın temelini oluşturan yapı gömmeyi gösteren basit bir çalışan yönetim sistemi oluşturalım.
Employee yapısının bir Person içerdiği bir hiyerarşi oluşturacaksın. Bu, kalıtımın nasıl çalıştığını yansıtır: Bir çalışan, işe ilişkin ek bilgilere sahip bir "kişidir". Person yapısını Employee içine gömerek kişinin tüm özelliklerinin yanı sıra çalışana özgü alanları da elde edersin.
Kodunu üç dosyaya düzenleyeceksin:
types.h: Her iki yapıyı da include guard'larıyla burada tanımla. Önce iki alanı olan birPersonyapısı oluştur:name(50 karakterlik bir karakter dizisi) veage(bir tamsayı). ArdındanEmployeeyapısını ilk üye olarak gömen ve birPersonalanı (bir tamsayı) ekleyen biremployee_idyapısı tanımla.types.c: Birprint_employeeişaretçisi alan ve çalışanın bilgilerini yazdıranEmployeeadlı bir işlev uygula. Gömülü kişinin verilerine, öğrendiğin zincirlenmiş nokta/ok sözdizimini kullanarak eriş.main.c: BirEmployeedeğişkeni oluştur, gömülü kişinin adı ve yaşı da dahil olmak üzere tüm alanlarını doldur ve bilgileri görüntülemek için yazdırma işlevini kullan.
Üç girdi alacaksın: çalışanın adı (bir dize), yaşı (bir tamsayı) ve çalışan kimliği (bir tamsayı).
print_employee işlevin çalışanın bilgilerini şu biçimde göstermelidir:
Employee: Alice
Age: 28
ID: 1001Burada Alice ad, 28 yaş ve 1001 girdilerinden alınan çalışan kimliğidir.
Gömülü yapının üyelerine üst üye üzerinden erişmeyi unutma; örneğin ada ulaşmak için önce person üyesi üzerinden ilerlemen gerekir.
Kendin dene
#include <stdio.h>
#include <string.h>
#include "types.h"
int main() {
// Girdiyi oku
char name[50];
int age;
int employee_id;
fgets(name, 50, stdin);
name[strcspn(name, "\n")] = '\0'; // Yeni satırı kaldır
scanf("%d", &age);
scanf("%d", &employee_id);
// TODO: Bir Employee değişkeni oluştur
// TODO: Gömülü kişinin adını ve yaşını doldur
// İpucu: İsim için strcpy kullan, employee.person.name ile eriş
// TODO: employee_id değerini ayarla
// TODO: print_employee'yi employee'nize bir işaretçi ile ç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