giGii

arrptr

Nov 28th, 2022
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.65 KB | None | 0 0
  1. #include <cassert>
  2. #include <cstdlib>
  3. #include <algorithm>
  4. #include <iostream>
  5.  
  6. template <typename Type>
  7. class ArrayPtr {
  8. public:
  9.     // Инициализирует ArrayPtr нулевым указателем
  10.     ArrayPtr() = default;
  11.  
  12.     // Создаёт в куче массив из size элементов типа Type.
  13.     // Если size == 0, поле raw_ptr_ должно быть равно nullptr
  14.     explicit ArrayPtr(size_t size) {
  15.         // Реализуйте конструктор самостоятельно
  16.         if (size > 0) {
  17.             raw_ptr_ = new Type[size];
  18.         }
  19.     }
  20.  
  21.     // Конструктор из сырого указателя, хранящего адрес массива в куче либо nullptr
  22.     explicit ArrayPtr(Type* raw_ptr) noexcept : raw_ptr_(raw_ptr) {
  23.         // Реализуйте конструктор самостоятельно
  24.     }
  25.  
  26.     // Запрещаем копирование
  27.     ArrayPtr(const ArrayPtr& other) = delete;
  28.  
  29.     ~ArrayPtr() {
  30.         // Напишите деструктор самостоятельно
  31.         delete[] raw_ptr_;
  32.     }
  33.  
  34.     // Запрещаем присваивание
  35.     ArrayPtr& operator=(const ArrayPtr& other) = delete;
  36.  
  37.     // Прекращает владением массивом в памяти, возвращает значение адреса массива
  38.     // После вызова метода указатель на массив должен обнулиться
  39.     [[nodiscard]] Type* Release() noexcept {
  40.         // Заглушка. Реализуйте метод самостоятельно
  41.         Type* tmp = raw_ptr_;
  42.         raw_ptr_ = nullptr;
  43.        
  44.         return tmp;
  45.     }
  46.  
  47.     // Возвращает ссылку на элемент массива с индексом index
  48.     Type& operator[](size_t index) noexcept {
  49.         // Реализуйте операцию самостоятельно
  50.         return *(raw_ptr_ + index);
  51.     }
  52.  
  53.     // Возвращает константную ссылку на элемент массива с индексом index
  54.     const Type& operator[](size_t index) const noexcept {
  55.         // Реализуйте операцию самостоятельно
  56.         return *(raw_ptr_ + index);
  57.     }
  58.  
  59.     // Возвращает true, если указатель ненулевой, и false в противном случае
  60.     explicit operator bool() const {
  61.         // Заглушка. Реализуйте операцию самостоятельно
  62.         return raw_ptr_;
  63.     }
  64.  
  65.     // Возвращает значение сырого указателя, хранящего адрес начала массива
  66.     Type* Get() const noexcept {
  67.         // Заглушка. Реализуйте метод самостоятельно
  68.         return raw_ptr_;
  69.     }
  70.  
  71.     // Обменивается значениям указателя на массив с объектом other
  72.     void swap(ArrayPtr& other) noexcept {
  73.         // Реализуйте метод самостоятельно
  74.         std::swap(raw_ptr_, other.raw_ptr_);
  75.     }
  76.  
  77. private:
  78.     Type* raw_ptr_ = nullptr;
  79. };
  80.  
  81. int main() {
  82.     ArrayPtr<int> numbers(10);
  83.     const auto& const_numbers = numbers;
  84.  
  85.     numbers[2] = 42;
  86.     assert(const_numbers[2] == 42);
  87.     assert(&const_numbers[2] == &numbers[2]);
  88.  
  89.     assert(numbers.Get() == &numbers[0]);
  90.  
  91.     ArrayPtr<int> numbers_2(5);
  92.     numbers_2[2] = 43;
  93.  
  94.     numbers.swap(numbers_2);
  95.  
  96.     assert(numbers_2[2] == 42);
  97.     assert(numbers[2] == 43);
  98.  
  99.     std::cout << "OK" << std::endl;
  100. }
Advertisement
Add Comment
Please, Sign In to add comment