Menu
Coddy logo textTech

Constructor Deseni

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

Java veya C++ gibi dillerde nesneleri kurucuları kullanarak oluşturursunuz: belleği otomatik olarak ayıran ve alanları başlatan özel işlevler. C'de böyle bir özellik yoktur, ancak bunu basit bir kalıpla simüle edebiliriz: bir create_ işlevi.

C'de bir kurucu işlevi genellikle üç şey yapar: malloc ile bellek ayırır, tüm alanları uygun değerlerle başlatır ve yeni nesneye bir işaretçi döndürür:

typedef struct {
    char *name;
    int age;
} Person;

Person *create_person(const char *name, int age) {
    Person *p = malloc(sizeof(Person));
    p->name = malloc(strlen(name) + 1);
    strcpy(p->name, name);
    p->age = age;
    return p;
}

Fonksiyon bir işaretçi döndürür, çünkü nesne yığında değil, öbekte yaşar. Bu, nesnenin fonksiyon döndükten sonra da varlığını sürdürmesi ve serbestçe aktarılabilmesi anlamına gelir. Çağıran taraf onu şu şekilde kullanır:

Person *alice = create_person("Alice", 30);
printf("%s is %d years old\n", alice->name, alice->age);

Yapıcının tüm karmaşık ayrıntıları nasıl yönettiğine dikkat edin: yapıyı ayırmak, dize için alan ayırmak ve verileri kopyalamak. Çağıran yalnızca başlangıç değerlerini sağlar ve kullanıma hazır bir nesne alır. Bu, oluşturma mantığını tek bir yerde kapsüller ve kodunuzu daha temiz ve hatalara daha az yatkın hâle getirir.

challenge icon

Görev

Kolay

Yığın üzerinde kitap nesneleri oluşturmak için oluşturucu kalıbını kullanan bir Book modülü oluşturalım. Tüm bellek ayırma ve başlatma işlemlerini gerçekleştiren, kullanıma hazır bir işaretçi döndüren bir create_ işlevi yazma pratiği yapacaksın.

Üç dosya oluşturacaksın:

  • book.h: İki üyeye sahip bir Book yapısı tanımla: char *title (dinamik olarak ayrılmış bir dizeye işaretçi) ve int pages. Ayrıca bir başlık dizesi ve sayfa sayısı alan, ardından yeni oluşturulmuş bir Book'a işaretçi döndüren create_book oluşturucu işlevini bildir. BOOK_H sembolüyle include guard kullan.
  • book.c: create_book işlevini uygula. Oluşturucun önce Book yapısının kendisi için bellek ayırmalı, ardından başlık dizesi için ayrı bellek ayırmalı (null sonlandırıcıyı hesaba katmayı unutma), başlığı yeni belleğe kopyalamalı, pages alanını ayarlamalı ve yeni Book'a işaretçiyi döndürmelidir.
  • main.c: Bir kitap oluşturmak ve bilgilerini görüntülemek için oluşturucunu kullan.

İki girdi alacaksın: kitap başlığı (bir dize) ve sayfa sayısı (bir tam sayı).

Ana dosyanda, sağlanan değerlerle yeni bir kitap oluşturmak için create_book kullan, ardından bilgilerini şu biçimde yazdır:

Title: {title}
Pages: {pages}

Örneğin, The C Programming Language ve 272 girdileriyle çıktı şu şekilde olur:

Title: The C Programming Language
Pages: 272

Oluşturucunun tüm oluşturma mantığını kapsadığını unutma: çağıran yalnızca başlangıç değerlerini sağlar ve kullanıma hazır, tamamen başlatılmış bir nesne alır.

Kendin dene

#include <stdio.h>
#include <stdlib.h>
#include "book.h"

int main() {
    char title[256];
    int pages;
    
    // Girdiyi oku
    fgets(title, sizeof(title), stdin);
    // Varsa yeni satırı kaldır
    for (int i = 0; title[i]; i++) {
        if (title[i] == '\n') {
            title[i] = '\0';
            break;
        }
    }
    scanf("%d", &pages);
    
    // TODO: Sağlanan değerlerle yeni bir kitap oluşturmak için create_book kullan
    
    // TODO: Kitap bilgilerini gerekli formatta yazdır:
    // Title: {title}
    // Pages: {pages}
    
    // TODO: İşin bitince ayrılan belleği serbest bırakmayı unutma
    
    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