Użycie C++ unique_ptr

Use C Unique_ptr



Inteligentne wskaźniki służą do dynamicznego przydzielania zasobu. Wiele typów inteligentnych wskaźników jest używanych w C++ do różnych celów, takich jak auto_ptr , unikalny_ptr , oraz shared_ptr . Wskaźnik auto_ptr jest przestarzały w nowej wersji C++. Unikatowe_ptr jest używane zamiast auto_ptr. Obiekt tego wskaźnika może przejąć na własność wskaźnik. Obiekt tego wskaźnika jest wyłącznym właścicielem wskaźnika i żaden inny wskaźnik nie może wskazywać na obiekt. Unique_ptr automatycznie usuwa obiekty. Ten wskaźnik zarządza tymi obiektami w przypadku ich zniszczenia, zmiany wartości obiektu lub wywołania funkcji reset(). Funkcje unique_ptr i zastosowania tego wskaźnika są omówione w tym samouczku.

Główne komponenty:







Poniżej przedstawiono dwa główne komponenty obiektu unique_ptr:



A. Zapisany wskaźnik:



Służy do zarządzania obiektami tworzonymi przez unikalny wskaźnik. Jest tworzony w momencie tworzenia wskaźnika i można go zmieniać na różne sposoby.





B. Zapisany usuwacz:

Pobiera argument typu przechowywanego wskaźnika, który jest używany do usuwania obiektu zarządzanego. Jest również tworzony w momencie tworzenia wskaźnika i może być zmieniany na różne sposoby.



Przykład 1: Utwórz obiekt wskaźnika klasy za pomocą konstruktora

Sposobem deklarowania unikalnych obiektów wskaźnika klasy i uzyskiwania dostępu do metody klasy jest użycie obiektów, jak pokazano w poniższym przykładzie. W kodzie została zadeklarowana klasa z konstruktorem i metodą publiczną. Konstruktor ma trzy argumenty. Pierwszy unikalny wskaźnik został utworzony przez wywołanie konstruktora z trzema wartościami argumentów. ten Wynik() Metoda jest wywoływana przez obiekt wskaźnika, który oblicza sumę wartości trzech argumentów konstruktora. Następnie tworzony jest drugi unikalny obiekt wskaźnika bez wywoływania konstruktora, a pierwszy wskaźnik jest przenoszony do drugiego wskaźnika. ten Wynik() Metoda jest wywoływana przez drugi obiekt wskaźnika.

//Uwzględnij niezbędne biblioteki

#włączać

#włączać

używanie standardowej przestrzeni nazw;

//Zdefiniuj klasę
klasa Dodatek{

int liczba1, liczba2, liczba3;
publiczny:
//Zadeklaruj konstruktora
Dodatek(int a, int b, int c)
{
liczba1 = a;
liczba2 = b;
liczba3 = c;
}
//Zadeklaruj metodę obliczaniasuma
int Wynik()
{
powrótnumer1 + numer2 + numer3;
}
};
int main()
{
//Zadeklaruj pierwszy wskaźnik
unikalny_wskaźnik_ptr1(Nowy dodatek(Cztery pięć,55,30));

koszt<<'Wynik sumy przy użyciu pierwszego wskaźnika:'<Wynik() <<' ';
//Zadeklaruj drugi wskaźnik
unikalny_ptr wskaźnik2;
//Przesuń pierwszy wskaźnik do drugiego wskaźnika
wskaźnik2 = ruch(wskaźnik1);

koszt<<'Wynik sumy przy użyciu drugiego wskaźnika:'<Wynik() <<' ';
powrót0;
}

Wyjście:

Poniższe dane wyjściowe pojawią się po wykonaniu powyższego kodu. Suma 45, 55 i 30 to 130, która została wydrukowana dla obu wskaźników.

Przykład 2: Utwórz obiekt wskaźnika klasy z konstruktorem i destruktorem

Sposób deklarowania unikatowego obiektu wskaźnika klasy z konstruktorem i destruktorem został przedstawiony w poniższym przykładzie. Klasa zawiera konstruktor z jednym argumentem, metodę publiczną o nazwie Display() do wartości zmiennej klasy oraz destruktor, który wyświetli komunikat o zniszczeniu przed zniszczeniem obiektu klasy. Metoda Display() jest wywoływana po utworzeniu unikalnego obiektu wskaźnika w kodzie.

//Uwzględnij niezbędne biblioteki

#włączać

#włączać

używanie standardowej przestrzeni nazw;

//Zdefiniuj klasę
klasa Klient
{
nazwa ciągu;

publiczny:
//Zadeklaruj konstruktora
Klient(ciąg n)
{
nazwa = n;
koszt<<„Zasoby są przydzielane. ';
}

//Zadeklaruj metodę drukowania nazwy klienta
nieważny wyświetlacz()
{
koszt<<'Nazwa klienta to:'<<Nazwa<<' ';
}

//Zadeklaruj destruktor
~Klient()
{
koszt<<„Zasób jest zniszczony. ';
}
};
int main()
{
//Przydziel obiekt Resource, którego właścicielem jest unique_ptr
unique_ptruPointer{nowy klient(„Mir Abbas”) };
uWskaźnik->Wyświetlacz();
powrót0;
}

Wyjście:

Po wykonaniu powyższego kodu pojawi się następujący wynik:

Przykład 3: Sprawdź wskaźnik po przeniesieniu własności

Sposób sprawdzenia własności unikalnego wskaźnika pokazano w poniższym przykładzie, tworząc dwa unikalne wskaźniki klasy. W kodzie została zadeklarowana klasa z dwiema zmiennymi łańcuchowymi i metodą publiczną. Metoda Book_details() klasy jest wywoływana po utworzeniu pierwszego unikatowego obiektu wskaźnika klasy. Następnie został utworzony drugi unikalny obiekt wskaźnika, a pierwszy wskaźnik został przeniesiony do drugiego wskaźnika, który niszczy pierwszy wskaźnik. Własność obu wskaźników należy sprawdzić później.

//Uwzględnij niezbędne biblioteki

#włączać

#włączać

używanie standardowej przestrzeni nazw;

//Zdefiniuj klasę
klasa Książka{

tytuł ciągu =„Język programowania C++”;
autor ciągu ='Bjarne Stroustrup';

publiczny:
//Zadeklaruj metodę drukowania szczegółów książki
voidBook_details()
{
koszt<<'Nazwa książki: '<<tytuł<<' ';
koszt<<'Imię autora: '<<autor<<' ';
}
};
int main()
{
//Zadeklaruj pierwszy wskaźnik
unikalny_wskaźnik_ptr1(Nowa książka());

wskaźnik 1->Szczegóły_książki();
//Zadeklaruj drugi wskaźnik
unikalny_ptr wskaźnik2;
//Przesuń pierwszy wskaźnik do drugiego wskaźnika
wskaźnik2 = ruch(wskaźnik1);

//Sprawdź pierwszy wskaźnik
Jeśli (static_cast(wskaźnik1))koszt<<„Pierwszy wskaźnik nie jest pusty” ';
innycout<<„Pierwszy wskaźnik jest pusty” ';
//Sprawdź drugi wskaźnik
Jeśli (static_cast(wskaźnik2))koszt<<„Drugi wskaźnik nie jest pusty” ';
innycout<<„Drugi wskaźnik jest pusty” ';

powrót0;
}

Wyjście:

Poniższe dane wyjściowe pojawią się po wykonaniu powyższego kodu. Zgodnie z danymi wyjściowymi, własność pierwszego wskaźnika została usunięta, a komunikat: Pierwszy wskaźnik ma wartość null wydrukowano dla pierwszego wskaźnika. Istnieje własność drugiego wskaźnika, a komunikat, Pierwszy wskaźnik nie jest pusty wydrukował dla drugiego wskaźnika:

Wniosek:

Cele używania unikalnego wskaźnika w programowaniu C++ zostały opisane w tym samouczku przy użyciu wielu przykładów. Sposoby tworzenia unikalnego wskaźnika, przeniesienia własności wskaźnika i sprawdzenia aktualnej własności wskaźnika zostały wyjaśnione tutaj, aby pomóc czytelnikom prawidłowo poznać użycie unikalnego wskaźnika.