C++ unique_ptr kullanımı

Use C Unique_ptr



Akıllı işaretçiler, kaynağı dinamik olarak tahsis etmek için kullanılır. C++'da çeşitli amaçlar için birçok akıllı işaretçi türü kullanılır. auto_ptr , benzersiz_ptr , ve share_ptr . auto_ptr işaretçisi, C++'ın yeni sürümünde kullanımdan kaldırılmıştır. unique_ptr, auto_ptr'nin yerine kullanılır. Bu işaretçinin nesnesi, işaretçinin sahipliğini alabilir. Bu işaretçinin nesnesi, işaretçinin benzersiz sahibidir ve başka hiçbir işaretçi nesneyi işaret edemez. Unique_ptr, nesneleri otomatik olarak siler. Bu işaretçi, nesneler yok edildiğinde veya nesnenin değeri değiştiğinde veya reset() işlevi çağrıldığında bu nesneleri yönetir. Unique_ptr'nin özellikleri ve bu işaretçinin kullanımları bu öğreticide tartışılmaktadır.

Ana Bileşenler:







Unique_ptr nesnesinin iki ana bileşeni aşağıda verilmiştir:



A. Depolanan İşaretçi:



Benzersiz bir işaretçi tarafından oluşturulan nesneleri yönetmek için kullanılır. İşaretçi oluşturma sırasında oluşturulur ve farklı şekillerde değiştirilebilir.





B. Depolanan Silici:

Yönetilen nesneyi silmek için kullanılan saklanan işaretçi türünün bağımsız değişkenini alır. Ayrıca, işaretçi oluşturma sırasında oluşturulur ve farklı yollarla değiştirilebilir.



Örnek 1: Yapıcılı Bir Sınıfın İşaretçi Nesnesini Oluşturun

Bir sınıfın benzersiz işaretçi nesnelerini bildirmenin ve sınıfın yöntemine erişmenin yolu, aşağıdaki örnekte gösterildiği gibi nesneleri kullanmaktır. Kodda yapıcı ve genel yöntem içeren bir sınıf bildirildi. Yapıcının üç argümanı vardır. İlk benzersiz işaretçi, kurucu üç argüman değeri ile çağrılarak yaratılmıştır. NS Sonuç() yöntem, yapıcının üç bağımsız değişken değerinin toplamını hesaplayan işaretçi nesnesi tarafından çağrılır. Ardından, kurucu çağrılmadan ikinci benzersiz işaretçi nesnesi oluşturulur ve ilk işaretçi ikinci işaretçiye taşınır. NS Sonuç() yöntem, ikinci işaretçi nesnesi tarafından çağrılır.

//Gerekli kütüphaneleri dahil et

#Dahil etmek

#Dahil etmek

ad alanı std kullanarak;

//Sınıfı tanımlayın
sınıf Ekleme{

int sayı1, sayı2, sayı3;
halka açık:
//Yapıcıyı bildirin
Ek(int a, int b, int c)
{
sayı1 = bir;
sayı2 = b;
sayı3 = c;
}
//Hesaplama yöntemini bildirintoplam
int Sonuç()
{
dönüşsayı1 + sayı2 + sayı3;
}
};
int ana()
{
//İlk işaretçiyi bildirin
unique_ptr işaretçi1(yeni eklenti(Dört beş,55,30));

maliyet<<'İlk işaretçiyi kullanarak toplamanın sonucu:'<Sonuç() <<' ';
//İkinci işaretçiyi bildirin
benzersiz_ptr işaretçisi2;
//İlk işaretçiyi ikinci işaretçiye taşı
işaretçi2 = hareket(işaretçi1);

maliyet<<'İkinci işaretçiyi kullanarak toplamanın sonucu:'<Sonuç() <<' ';
dönüş0;
}

Çıktı:

Yukarıdaki kodu çalıştırdıktan sonra aşağıdaki çıktı görünecektir. Her iki işaretçi için yazdırılan 45, 55 ve 30'un toplamı 130'dur.

Örnek 2: Constructor ve Destructor İçeren Bir Sınıfın Pointer Nesnesini Oluşturun

Constructor ve destructor ile bir sınıfın benzersiz bir pointer nesnesini tanımlamanın yolu aşağıdaki örnekte gösterilmiştir. Sınıf, bir bağımsız değişkene sahip bir kurucu, sınıf değişkeninin değerine Display() adlı bir genel yöntem ve sınıfın nesnesini yok etmeden önce bir yok etme mesajı yazdıracak bir yıkıcı içerir. Kodda benzersiz işaretçi nesnesi oluşturulduktan sonra Display() yöntemi çağrılır.

//Gerekli kütüphaneleri dahil et

#Dahil etmek

#Dahil etmek

ad alanı std kullanarak;

//Sınıfı tanımlayın
sınıf Müşteri
{
dize adı;

halka açık:
//Yapıcıyı bildirin
Müşteri(dize n)
{
isim = n;
maliyet<<'Kaynak tahsis edildi. ';
}

//Müşteri adını yazdırmak için yöntem bildir
Boş Ekran()
{
maliyet<<'Müşterinin adı:'<<isim<<' ';
}

//Yıkıcıyı ilan et
~Müşteri()
{
maliyet<<'Kaynak yok edildi. ';
}
};
int ana()
{
//Unique_ptr'nin sahip olduğu Resource nesnesini tahsis edin
unique_ptruPointer{Yeni müşteri('Mir Abbas') };
uPointer->Görüntülemek();
dönüş0;
}

Çıktı:

Yukarıdaki kodu çalıştırdıktan sonra aşağıdaki çıktı görünecektir:

Örnek 3: Sahipliği Aktardıktan Sonra İşaretçiyi Kontrol Edin

Benzersiz işaretçinin sahipliğini kontrol etmenin yolu, bir sınıfın iki benzersiz işaretçisi oluşturarak aşağıdaki örnekte gösterilmiştir. Kodda iki dize değişkenli ve genel bir yönteme sahip bir sınıf bildirildi. Sınıfın ilk benzersiz işaretçi nesnesi oluşturulduktan sonra sınıfın Book_details() yöntemi çağrılır. Ardından, ikinci benzersiz işaretçi nesnesi yaratıldı ve ilk işaretçi, birinci işaretçiyi yok eden ikinci işaretçiye taşındı. Her iki işaretçinin sahipliği daha sonra kontrol edilmelidir.

//Gerekli kütüphaneleri dahil et

#Dahil etmek

#Dahil etmek

ad alanı std kullanarak;

//Sınıfı tanımlayın
sınıf kitabı{

dize başlığı ='C++ Programlama Dili';
dize yazarı ='Bjarne Stroustrup';

halka açık:
//Kitap ayrıntılarını yazdırmak için yöntem bildir
voidBook_details()
{
maliyet<<'Kitap Adı:'<<Başlık<<' ';
maliyet<<'Yazar Adı:'<<yazar<<' ';
}
};
int ana()
{
//İlk işaretçiyi bildirin
unique_ptr işaretçi1(yeni kitap());

işaretçi1->Kitap_ayrıntıları();
//İkinci işaretçiyi bildirin
benzersiz_ptr işaretçisi2;
//İlk işaretçiyi ikinci işaretçiye taşı
işaretçi2 = hareket(işaretçi1);

//İlk işaretçiyi kontrol edin
Eğer (static_cast(işaretçi1))maliyet<<'İlk işaretçi boş değil ';
başka türlü<<'İlk işaretçi boş ';
//İkinci işaretçiyi kontrol edin
Eğer (static_cast(işaretçi2))maliyet<<'İkinci işaretçi boş değil ';
başka türlü<<'İkinci işaretçi boş ';

dönüş0;
}

Çıktı:

Yukarıdaki kodu çalıştırdıktan sonra aşağıdaki çıktı görünecektir. Çıktıya göre, ilk işaretçinin sahipliği kaldırıldı ve mesaj, İlk işaretçi boş ilk işaretçi için yazdırdı. İkinci işaretçinin sahipliği var ve mesaj, İlk işaretçi boş değil ikinci işaretçi için yazdırdı:

Çözüm:

C++ programlamasında benzersiz bir işaretçi kullanmanın amaçları bu öğreticide birden çok örnek kullanılarak açıklanmıştır. Benzersiz bir işaretçi oluşturma, işaretçinin sahipliğini aktarma ve işaretçinin mevcut sahipliğini kontrol etme yolları, okuyucuların benzersiz işaretçinin kullanımını doğru bir şekilde bilmelerine yardımcı olmak için burada açıklanmıştır.