Advertisement
avr39ripe

PV913SmartPointerBasics

Aug 10th, 2020 (edited)
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.03 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.     void release() noexcept { delete 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. int main()
  65. {
  66.     srand(time(nullptr));
  67.  
  68.     //for (int i{ 0 }; i < 5; ++i)
  69.     //{
  70.     //  try
  71.     //  {
  72.     //      foo();
  73.     //  }
  74.     //  catch (std::exception ex)
  75.     //  {
  76.     //      std::cout << "Exception! => " << ex.what() << '\n';
  77.     //  }
  78.     //     
  79.     //}
  80.     SmartPtr<Element> sPtr{ new Element{rand() % 10} };
  81.     std::cout << "Value is: " << sPtr->getVal() << '\n';
  82.     std::cout << "sPtr == nullptr " << (sPtr.get() == nullptr) << '\n';
  83.     auto sPtrOne{ std::move(sPtr) };
  84.     std::cout << "sPtr == nullptr " << (sPtr.get() == nullptr) << '\n';
  85.     std::cout << "sPtrOne == nullptr " << (sPtrOne.get() == nullptr) << '\n';
  86.     std::cout << "Value is: " << sPtrOne->getVal() << '\n';
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement