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.
Görev
KolayYığı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 birBookyapısı tanımla:char *title(dinamik olarak ayrılmış bir dizeye işaretçi) veint 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ürencreate_bookoluşturucu işlevini bildir.BOOK_Hsembolüyle include guard kullan.book.c:create_bookiş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: 272Oluş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;
}
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