Derin Kopyalama
Coddy'nin C Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 15 / 61.
C'de bir yapıyı başka bir yapıya atadığınızda sığ kopya elde edersiniz: tüm alanlar bayt bayt kopyalanır. Bu, tamsayılar gibi basit değerler için sorunsuz çalışır; ancak işaretçilerle ilgili bir sorun oluşturur: her iki yapı da aynı belleği işaret eder.
typedef struct {
char *name;
int age;
} Person;
Person alice = {"Alice", 30};
Person copy = alice; // Sığ kopya!
// Hem alice.name hem de copy.name AYNI string'e işaret eder
Birini serbest bırakırsanız diğeri geçersiz hâle gelir. Dizeyi biri aracılığıyla değiştirirseniz ikisi de değişikliği görür. Genellikle istediğiniz şey bu değildir.
Derin kopya, işaretçi üyeleri için yeni bellek ayırır ve gerçek verileri kopyalar:
Person *clone_person(const Person *original) {
Person *copy = malloc(sizeof(Person));
copy->name = malloc(strlen(original->name) + 1);
strcpy(copy->name, original->name);
copy->age = original->age;
return copy;
}
Artık her nesne kendi dizesine sahip. Birini diğerini etkilemeden değiştirebilir veya serbest bırakabilirsin. Örüntü basittir: her işaretçi üyesi için yeni bellek ayır ve yalnızca adresi değil, içeriği kopyala.
Görev
KolayDerin kopyalama desenini gösteren bir Student modülü oluşturalım. Bir öğrenci nesnesinin tamamen bağımsız bir kopyasını üreten bir klonlama işlevi oluşturacaksınız: özgün nesneyi değiştirmek veya serbest bırakmak klon üzerinde hiçbir etkiye sahip olmayacak.
Üç dosya oluşturacaksınız:
student.h: İki üyeye sahip birStudentyapısı tanımlayın:char *name(dinamik olarak ayrılmış bir dize) veint grade. Üç işlev tanımlayın:create_student: bir ad ve not alan, yeni bir Student işaretçisi döndüren yapıcıclone_student: birconst Student *alan ve yeni, bağımsız bir kopyaya işaretçi döndüren işlevfree_student: ayrılmış tüm belleği düzgün biçimde serbest bırakan yıkıcı
STUDENT_Hsembolüyle include guard kullanın.student.c: Üç işlevin tümünü uygulayın.clone_studentişleviniz temel noktadır. Hem yapı hem de ad dizesi için yeni bellek ayırmalı, ardından gerçek dize verilerini (yalnızca işaretçi adresini değil) kopyalamalıdır. Bu, klonun özgün nesneden tamamen ayrı olan kendi belleğine sahip olmasını sağlar.main.c: Bir öğrenci oluşturun, onu klonlayın, her iki öğrencinin bilgilerini görüntüleyin ve ardından her iki nesneyi de düzgün biçimde temizleyin.
İki girdi alacaksınız: öğrenci adı (bir dize) ve not (bir tam sayı).
Ana dosyanızda, sağlanan değerlerle bir öğrenci oluşturun, ardından bu öğrencinin bir klonunu oluşturun. Aynı verileri içerdiklerini doğrulamak için hem özgün öğrencinin hem de klonun bilgilerini yazdırın. Son olarak her iki öğrenciyi de serbest bırakın ve bir onay iletisi yazdırın.
Çıktıyı şu biçimde yazdırın:
Original: {name}, Grade: {grade}
Clone: {name}, Grade: {grade}
Both freedÖrneğin, girdiler Alice ve 95 olduğunda çıktı şöyle olur:
Original: Alice, Grade: 95
Clone: Alice, Grade: 95
Both freedDerin kopyalama deseni, her nesnenin gerçekten bağımsız olmasını sağlar: klon, özgün nesnenin belleğine paylaşılan bir işaretçi yerine kendi ayrılmış dizesine sahiptir.
Kendin dene
#include <stdio.h>
#include <stdlib.h>
#include "student.h"
int main() {
char name[100];
int grade;
// Girdiyi oku
scanf("%s", name);
scanf("%d", &grade);
// TODO: Sağlanan ad ve not ile bir öğrenci oluştur
// TODO: Öğrencinin bir klonunu oluştur
// TODO: Print the original student's information
// Biçim: "Original: {name}, Grade: {grade}"
// TODO: Klonun bilgilerini yazdır
// Biçim: "Clone: {name}, Grade: {grade}"
// TODO: Her iki öğrenciyi de serbest bırak
// Onayı yazdır
printf("Both freed\n");
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