Menu
Coddy logo textTech

Struct Gömme

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

C++ veya Java gibi nesne yönelimli dillerde kalıtım (inheritance), bir sınıfın bir üst sınıftan özellikler kazanmasını sağlar. C'de yerleşik kalıtım yoktur, ancak bunu kompozisyon (composition) adı verilen bir teknikle —bir struct'ı diğerinin içine yerleştirerek— simüle edebiliriz.

Fikir basittir: Eğer bir Child, bir Parent yapısının tüm özelliklerine ihtiyaç duyuyorsa, Parent yapısını Child yapısını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 kendi grade alanını içerir. Bu kompozisyondur — çocuk bir ebeveyn "olmak" yerine bir ebeveyne "sahiptir", ancak etki kalıtıma benzerdir.

Bir çocuk örneği üzerinden ebeveynin ü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 desen, C'de tür hiyerarşileri oluşturmanın temelini oluşturur. Bir temel struct'ı ilk üye olarak gömerek, gelecek derslerde keşfedeceğimiz güçlü tekniklerin kapısını aralarız.

challenge icon

Görev

Kolay

C dilinde kalıtımın temeli olan struct gömme (struct embedding) konusunu gösteren basit bir çalışan yönetim sistemi oluşturalım.

Bir Employee yapısının bir Person yapısını içerdiği bir hiyerarşi oluşturacaksınız. Bu, kalıtımın nasıl çalıştığını yansıtır: bir çalışan, ek iş bilgileri olan bir kişidir ("is a" ilişkisi). Person yapısını Employee içine gömerek, kişinin tüm özelliklerine ve çalışana özgü alanlara sahip olursunuz.

Kodunuzu üç dosya halinde düzenleyeceksiniz:

  • types.h: Her iki yapıyı da burada include guard'lar ile tanımlayın. İlk olarak, iki alanı olan bir Person yapısı oluşturun: name (50 karakterlik bir karakter dizisi) ve age (bir tam sayı). Ardından, ilk üyesi olarak Person yapısını gömen ve bir employee_id alanı (bir tam sayı) ekleyen bir Employee yapısı tanımlayın.
  • types.c: Bir Employee işaretçisi alan ve bilgilerini yazdıran print_employee adlı bir fonksiyonu uygulayın. Öğrendiğiniz zincirleme nokta/ok (dot/arrow) sözdizimini kullanarak gömülü kişinin verilerine erişin.
  • main.c: Bir Employee değişkeni oluşturun, tüm alanlarını doldurun (gömülü kişinin adı ve yaşı dahil) ve bilgileri görüntülemek için yazdırma fonksiyonunuzu kullanın.

Üç girdi alacaksınız: çalışanın adı (bir dize), yaşı (bir tam sayı) ve çalışan kimliği (bir tam sayı).

print_employee fonksiyonunuz çalışanın bilgilerini şu formatta çıktı vermelidir:

Employee: Alice
Age: 28
ID: 1001

Burada Alice isim, 28 yaş ve 1001 girdilerinizden gelen çalışan kimliğidir.

Gömülü yapının üyelerine üst üye aracılığıyla erişmeyi unutmayın; örneğin, isme ulaşmak için önce person üyesi üzerinden ilerleyeceksiniz.

Kopya kağıdı

C'de yerleşik kalıtım yoktur, ancak bunu composition (bileşim) kullanarak —bir yapıyı (struct) diğerinin içine gömerek— simüle edebilirsiniz.

Bir ebeveyn-çocuk (parent-child) ilişkisi oluşturmak için, ebeveyn yapısını çocuk yapısının bir üyesi olarak gömün:

typedef struct {
    int id;
    char name[50];
} Parent;

typedef struct {
    Parent parent;  // Gömülü yapı
    int grade;
} Child;

Çocuk yapısı, ebeveynin tüm özelliklerini ve kendi ek alanlarını içerir. Bu, bir "has a" (sahip olma) ilişkisini temsil eder.

Gömülü yapının üyelerine erişmek için nokta operatörünü iki kez kullanın:

Child c;
c.parent.id = 101;
c.parent.name[0] = 'A';
c.grade = 5;

Pointer'larla (işaretçilerle) çalışırken, gömülü yapının üyelerine erişmek için ok operatörünü kullanın:

Child *ptr = &c;
ptr->parent.id = 101;
ptr->grade = 5;

Temel yapıyı ilk üye olarak gömmek, C'de tür hiyerarşileri oluşturmak için gelişmiş tekniklere olanak tanıyan yaygın bir kalıptır.

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 karakterini kaldır
    scanf("%d", &age);
    scanf("%d", &employee_id);
    
    // TODO: Bir Employee değişkeni oluşturun
    
    // TODO: Gömülü person yapısının ad ve yaş bilgilerini doldurun
    // İpucu: İsim için strcpy kullanın, erişimi employee.person.name ile sağlayın
    
    // TODO: employee_id değerini atayın
    
    // TODO: Çalışanınıza ait bir işaretçi (pointer) ile print_employee fonksiyonunu çağırın
    
    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