Advertisement
RobertDeMilo

BB3.12 Умный указатель unique_ptr

Jun 13th, 2024
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.04 KB | None | 0 0
  1. #include <iostream>
  2. #include <memory>
  3. using namespace std;
  4.  
  5. struct Actor
  6. {
  7.     Actor()
  8.     {
  9.         cout << "I was born!" << endl;
  10.     }
  11.     ~Actor()
  12.     {
  13.         cout << "I was deleted!" << endl;
  14.     }
  15.     void DoWork()
  16.     {
  17.         cout << "I did some job!" << endl;
  18.     }
  19. };
  20.  
  21. void run(Actor* ptr)
  22. {
  23.     if (ptr)
  24.     {
  25.         ptr->DoWork();
  26.     }
  27.     else
  28.     {
  29.         cout << "an actor was expected :-/" << endl;
  30.     }
  31. }
  32.  
  33. int main()
  34. {
  35.     //1//auto ptr = new Actor;
  36.     //1//ptr->DoWork();
  37.     //1//run(ptr);
  38.     //1//delete ptr;
  39.  
  40.     auto ptr = unique_ptr<Actor>(new Actor); // Созданный объект кладем в умный указатель
  41.     //unique_ptr - это шаблонный класс, его параметр шаблона - тип указатель, который он будет хранить и (объект на который он указывает )
  42.  
  43.     //Или для создания умного указателя на новый объект можно воспользоваться функцией make_unique
  44.     auto ptr = make_unique<Actor>();
  45.  
  46.     run(ptr.get());
  47.     //Метод get() необходим для того чтобы из умного указателя достать обычный указатель на тот объект, на который он указывает  
  48.  
  49.     //auto ptr2 = ptr; // У unique_ptr нет конструктора КОПИРОВАНИЯ
  50.     // На один и тот же динамический объект может указывать только один unique_ptr
  51.     // Не можем КОПИРОВАТЬ unique_ptr, но мы можем ПЕРЕМЕЩАТЬ его
  52.     auto ptr2 = move(ptr);
  53.     run(ptr2.get());
  54.  
  55.     run(ptr.get());// Вызываем функцию на исходном указателе после того как мы из него переместили
  56.     //Исходный unique_ptr оказался нулевым после перемещения
  57.  
  58.     return 0;
  59. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement