shushus

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

Jan 12th, 2023
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.40 KB | None | 0 0
  1. #include <cassert>
  2.  
  3. template <typename T>
  4. class ScopedPtr {
  5. public:
  6.     ScopedPtr() = default;
  7.  
  8.     explicit ScopedPtr(T* raw_ptr) noexcept {
  9.         ptr_ = raw_ptr;
  10.     }
  11.  
  12.     ScopedPtr(const ScopedPtr&) = delete;
  13.  
  14.     ~ScopedPtr() {
  15.         delete ptr_;
  16.     }
  17.  
  18.     T* GetRawPtr() const noexcept {
  19.         return ptr_;
  20.     }
  21.  
  22.     T* Release() noexcept {
  23.         T* ptr_helper = ptr_;
  24.         ptr_ = nullptr;
  25.         return ptr_helper;
  26.     }
  27.  
  28. private:
  29.     T* ptr_ = nullptr;
  30. };
  31.  
  32. int main() {
  33.     struct DeletionSpy {
  34.         explicit DeletionSpy(bool& is_deleted)
  35.             : is_deleted_(is_deleted) {
  36.         }
  37.         ~DeletionSpy() {
  38.             is_deleted_ = true;
  39.         }
  40.         bool& is_deleted_;
  41.     };
  42.  
  43.     {
  44.         bool is_deleted = false;
  45.         {
  46.             DeletionSpy* raw_ptr = new DeletionSpy(is_deleted);
  47.             ScopedPtr<DeletionSpy> p(raw_ptr);
  48.             assert(p.GetRawPtr() == raw_ptr);
  49.             assert(!is_deleted);
  50.         }
  51.         assert(is_deleted);
  52.     }
  53.  
  54.     {
  55.         bool is_deleted = false;
  56.         DeletionSpy* raw_ptr = new DeletionSpy(is_deleted);
  57.         {
  58.             ScopedPtr<DeletionSpy> scoped_ptr(raw_ptr);
  59.             assert(scoped_ptr.Release() == raw_ptr);
  60.             assert(scoped_ptr.GetRawPtr() == nullptr);
  61.         }
  62.         assert(!is_deleted);
  63.         delete raw_ptr;
  64.         assert(is_deleted);
  65.     }
  66. }
Advertisement
Add Comment
Please, Sign In to add comment