shushus

Спринт 7. Копирование объектов. Часть вторая. Задание 2.

Jan 12th, 2023
277
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.63 KB | None | 0 0
  1. #include <iostream>
  2. #include <cassert>
  3.  
  4. using namespace std;
  5.  
  6. template <typename T>
  7. class ScopedPtr {
  8. public:
  9.     ScopedPtr() = default;
  10.    
  11.     explicit ScopedPtr(T* raw_ptr) noexcept {
  12.         ptr_ = raw_ptr;
  13.     }
  14.  
  15.     explicit operator bool() const noexcept {
  16.         if(!ptr_){
  17.             return false;
  18.         }else{
  19.             return true;
  20.         }
  21.     }
  22.    
  23.     T& operator*() const {
  24.         if(!ptr_){
  25.             throw logic_error("Empty Raw Pointer"s);
  26.         }else{
  27.             return *ptr_;
  28.         }
  29.     }
  30.    
  31.     T* operator->() const {
  32.         if(!ptr_){
  33.             throw logic_error("Empty Raw Pointer"s);
  34.         }else{
  35.             return ptr_;
  36.         }
  37.     }
  38.  
  39.     ScopedPtr(const ScopedPtr&) = delete;
  40.  
  41.     ~ScopedPtr() {
  42.         delete ptr_;
  43.     }
  44.  
  45.     T* GetRawPtr() const noexcept {
  46.         return ptr_;
  47.     }
  48.  
  49.     T* Release() noexcept {
  50.         T* ptr_helper = ptr_;
  51.         ptr_ = nullptr;
  52.         return ptr_helper;
  53.     }
  54.  
  55. private:
  56.     T* ptr_ = nullptr;
  57. };
  58.  
  59. int main() {
  60.     {
  61.         const ScopedPtr<int> empty_ptr;
  62.         assert(!empty_ptr);
  63.  
  64.         const ScopedPtr<int> ptr_to_existing_object(new int(0));
  65.         assert(ptr_to_existing_object);
  66.  
  67.         static_assert(noexcept(static_cast<bool>(ptr_to_existing_object)));
  68.     }
  69.  
  70.     {
  71.         string* raw_ptr = new string("hello");
  72.         ScopedPtr<string> smart_ptr(raw_ptr);
  73.         assert(&*smart_ptr == raw_ptr);
  74.  
  75.         try {
  76.             ScopedPtr<int> empty_ptr;
  77.             *empty_ptr;
  78.             assert(false);
  79.         } catch (const logic_error&) {
  80.         } catch (...) {
  81.             assert(false);
  82.         }
  83.     }
  84.  
  85.     {
  86.         string* raw_ptr = new string("hello");
  87.         ScopedPtr<string> smart_ptr(raw_ptr);
  88.         assert(smart_ptr->data() == raw_ptr->data());
  89.  
  90.         try {
  91.             ScopedPtr<string> empty_ptr;
  92.             empty_ptr->clear();
  93.             assert(false);
  94.         } catch (const logic_error&) {
  95.         } catch (...) {
  96.             assert(false);
  97.         }
  98.     }
  99.  
  100.     {
  101.         struct Object {
  102.             Object() {
  103.                 cout << "Object is default constructed"s << endl;
  104.             }
  105.             void DoSomething() {
  106.                 cout << "Doing something"s << endl;
  107.             }
  108.             ~Object() {
  109.                 cout << "Object is destroyed"s << endl;
  110.             }
  111.         };
  112.  
  113.         ScopedPtr<Object> empty_smart_ptr;
  114.         assert(!empty_smart_ptr);
  115.  
  116.         ScopedPtr<Object> smart_ptr(new Object());
  117.         assert(smart_ptr);
  118.  
  119.         (*smart_ptr).DoSomething();
  120.         smart_ptr->DoSomething();
  121.     }
  122. }
Advertisement
Add Comment
Please, Sign In to add comment