avr39ripe

PV913qunique_ptr_basics

Aug 10th, 2020
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.26 KB | None | 0 0
  1. #include<iostream>
  2. #include <chrono>
  3.  
  4. class Element
  5. {
  6.     int val;
  7. public:
  8.     Element(int valP) : val{ valP } { std::cout << "Element constructed for " << this << '\n'; };
  9.     Element() : Element{ 0 } {};
  10.     ~Element(){ std::cout << "Element destructed for " << this << '\n'; };
  11.     int getVal() const { return val; };
  12. };
  13.  
  14.  
  15. template <typename T>
  16. class SmartPtr
  17. {
  18.     T* ptr;
  19. public:
  20.     SmartPtr(T* ptrP) : ptr{ ptrP } {}
  21.     ~SmartPtr() { delete ptr; }
  22.    
  23.     SmartPtr(const SmartPtr& obj) = delete;
  24.     SmartPtr& operator=(const SmartPtr& obj) = delete;
  25.  
  26.     SmartPtr(SmartPtr&& sPtr)
  27.         : ptr{ sPtr.ptr }
  28.     {
  29.         sPtr.ptr = nullptr;
  30.     }
  31.  
  32.     SmartPtr& operator=(SmartPtr&& sPtr)
  33.     {
  34.         if (!(&sPtr == this))
  35.         {
  36.             ptr = sPtr.ptr;
  37.             sPtr.ptr = nullptr;
  38.         }
  39.         return *this;
  40.     }
  41.  
  42.     T& operator*() { return *ptr; };
  43.     const T& operator*()const { return *ptr; };
  44.     T* operator->() { return ptr; };
  45.     const T* operator->()const { return ptr; };
  46.     T* release() noexcept { ptr = nullptr; return ptr; };
  47.     const T* get()const { return ptr; };
  48. };
  49.  
  50. void foo()
  51. {
  52.     //Element* ptr{ new Element{rand() % 10} };
  53.     //SmartPtr<Element> sPtr{ ptr };
  54.     SmartPtr<Element> sPtr{ new Element{rand() % 10} };
  55.  
  56.     std::cout << "Value is: " << sPtr->getVal() << '\n';
  57.     //if (ptr->getVal() < 6) { throw std::runtime_error("Too small"); };
  58.     if (sPtr->getVal() < 6) { throw std::runtime_error("Too small"); };
  59.  
  60.     // some work with ptr
  61.     //delete ptr;
  62. }
  63.  
  64. std::unique_ptr<Element> generateElement()
  65. {
  66.     auto ptr{ std::make_unique<Element>(rand() % 10) };
  67.     return ptr;
  68. }
  69.  
  70. void useElement(const Element& el)
  71. {
  72.     std::cout << "useElement: Value is: " << el.getVal() << '\n';
  73.     //return el;
  74. }
  75. int main()
  76. {
  77.     srand(time(nullptr));
  78.  
  79.     //for (int i{ 0 }; i < 5; ++i)
  80.     //{
  81.     //  try
  82.     //  {
  83.     //      foo();
  84.     //  }
  85.     //  catch (std::exception ex)
  86.     //  {
  87.     //      std::cout << "Exception! => " << ex.what() << '\n';
  88.     //  }
  89.     //     
  90.     //}
  91.     //SmartPtr<Element> sPtr{ new Element{rand() % 10} };
  92.     //std::cout << "Value is: " << sPtr->getVal() << '\n';
  93.     //std::cout << "sPtr == nullptr " << (sPtr.get() == nullptr) << '\n';
  94.     //delete sPtr.release();
  95.     //std::cout << "sPtr == nullptr " << (sPtr.get() == nullptr) << '\n';
  96.     //std::cout << " Programm is still running! \n";
  97.     /*auto sPtrOne{ std::move(sPtr) };
  98.     std::cout << "sPtr == nullptr " << (sPtr->get() == nullptr) << '\n';
  99.     std::cout << "sPtrOne == nullptr " << (sPtrOne.get() == nullptr) << '\n';
  100.     std::cout << "Value is: " << sPtrOne->getVal() << '\n';*/
  101.  
  102.     //std::unique_ptr<Element> uPtr{ std::make_unique<Element>(rand() % 10) };
  103.     std::unique_ptr<Element> uPtr{ generateElement() };
  104.     useElement(*uPtr);
  105.     std::cout << "uPtr != nullptr " << static_cast<bool>(uPtr) << '\n';
  106.  
  107.     return 0;
  108.  
  109.     std::cout << "Value is: " << uPtr->getVal() << '\n';
  110.     std::cout << "uPtr != nullptr " << static_cast<bool>(uPtr) << '\n';
  111.     //delete uPtr.release();
  112.     std::cout << "uPtr != nullptr " << static_cast<bool>(uPtr) << '\n';
  113.     auto uPtrOne{ std::move(uPtr) };
  114.     std::cout << "uPtr != nullptr " << static_cast<bool>(uPtr) << '\n';
  115.     std::cout << "uPtrOne != nullptr " << static_cast<bool>(uPtrOne) << '\n';
  116.     std::cout << "Value is: " << uPtrOne->getVal() << '\n';
  117.     uPtrOne.reset(new Element{ 42 });
  118.     std::cout << "Value is: " << uPtrOne->getVal() << '\n';
  119.     std::cout << " Programm is still running! \n";
  120. }
Advertisement
Add Comment
Please, Sign In to add comment