Advertisement
chevengur

СПРИНТ № 7 | Односвязный список | Урок 8: Создаём RAII-обёртку над массивом в динамической памяти

May 20th, 2024 (edited)
496
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.56 KB | None | 0 0
  1. #include <cassert>
  2. #include <cstdlib>
  3.  
  4. template <typename Type>
  5. class ArrayPtr {
  6. public:
  7.     ArrayPtr() = default;
  8.  
  9.     explicit ArrayPtr(size_t size) {
  10.         (size == 0) ? raw_ptr_ = nullptr : raw_ptr_ = new Type[size];
  11.     }
  12.  
  13.     explicit ArrayPtr(Type* raw_ptr) noexcept {
  14.         if (raw_ptr) raw_ptr_ = raw_ptr;      
  15.     }
  16.  
  17.     ArrayPtr(const ArrayPtr&) = delete;
  18.  
  19.     ~ArrayPtr() {
  20.         delete[] raw_ptr_;
  21.     }
  22.  
  23.     ArrayPtr& operator=(const ArrayPtr&) = delete;
  24.  
  25.     [[nodiscard]] Type* Release() noexcept {
  26.         Type* currentarr = raw_ptr_;
  27.         raw_ptr_ = nullptr;
  28.         return currentarr;
  29.     }
  30.  
  31.     Type& operator[](size_t index) noexcept {
  32.         return raw_ptr_[index];
  33.     }
  34.  
  35.     const Type& operator[](size_t index) const noexcept {
  36.         return raw_ptr_[index];
  37.     }
  38.  
  39.     explicit operator bool() const {
  40.         return (raw_ptr_) ? true : false;
  41.     }
  42.  
  43.     Type* Get() const noexcept {
  44.         return raw_ptr_;
  45.  
  46.     }
  47.  
  48.     void swap(ArrayPtr& other) noexcept {
  49.         Type* temp = other.raw_ptr_;
  50.         other.raw_ptr_ = raw_ptr_;
  51.         raw_ptr_ = temp;
  52.     }
  53.  
  54. private:
  55.     Type* raw_ptr_ = nullptr;
  56. };
  57.  
  58. int main() {
  59.     ArrayPtr<int> numbers(10);
  60.     const auto& const_numbers = numbers;
  61.  
  62.     numbers[2] = 42;
  63.     assert(const_numbers[2] == 42);
  64.     assert(&const_numbers[2] == &numbers[2]);
  65.  
  66.     assert(numbers.Get() == &numbers[0]);
  67.  
  68.     ArrayPtr<int> numbers_2(5);
  69.     numbers_2[2] = 43;
  70.  
  71.     numbers.swap(numbers_2);
  72.  
  73.     assert(numbers_2[2] == 42);
  74.     assert(numbers[2] == 43);
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement