🕵️
Введение в паттерны
  • Введение в паттерны
  • Паттерны
    • Оглавление
    • Порождающие паттерны
      • Фабричный метод
        • Реализации на С++
        • Реализации на Kotlin
        • Возможные реализации для решения конкретных задач на С++
      • Абстрактная фабрика
        • Реализации на С++
        • Реализации на Kotlin
        • Возможные реализации для решения конкретных задач на С++
      • Прототип
        • Реализации на С++
        • Реализации на Kotlin
        • Реализации на Java
        • Возможные реализации для решения конкретных задач на С++
      • Строитель
        • Реализации на С++
        • Реализации на Kotlin
      • Одиночка
        • Реализации на C++
        • Реализации на Kotlin
        • Возможные реализации для решения конкретных задач на С++
      • Пул объектов
        • Реализации на С++
    • Структурные паттерны
      • Адаптер
        • Реализации на С++
        • Реализации на Kotlin
        • Возможные реализации для решения конкретных задач
      • Декоратор
        • Реализации на С++
        • Реализации на Kotlin
      • Компоновщик
        • Реализации на С++
      • Мост
        • Реализации на С++
      • Заместитель
        • Реализации на С++
        • Реализации на Kotlin
      • Фасад
        • Реализации на С++
      • Приспособленец
        • Реализации на С++
    • Поведенческие паттерны
      • Стратегия
        • Реализации на С++
        • Реализации на Kotlin
      • Команда
        • Реализации на С++
        • Реализации на Kotlin
      • Цепочка обязанностей
        • Реализации на С++
        • Реализации на Kotlin
      • Подписчик-издатель
        • Реализации на С++
        • Реализации на Kotlin
      • Посетитель
        • Реализации на С++
        • Возможные реализации для решения конкретных задач
      • Посредник
        • Реализации на С++
        • Реализации на Kotlin
      • Шаблонный метод
        • Реализации на С++
      • Опекун
        • Реализации на С++
      • Итератор
        • Реализации на С++
        • Реализации на Kotlin
      • Свойство
        • Реализации на С++
        • Возможные реализации для решения конкретных задач
  • Введение в идиомы
  • Идиомы
    • Оглавление
    • RAII
    • Type erasure
      • Контейнеры с type erasure
    • CRTP
    • Статический полиморфизм
    • Shrink to fit
    • Proxy
    • Erase remove
    • Decltype (auto)
    • Copy and swap
    • Safe bool
    • Scope guard
    • Addressof
Powered by GitBook
On this page
  • Назначение
  • Решаемые задачи
  • Общая реализация на языке C++

Was this helpful?

  1. Идиомы

Copy and swap

Назначение

Идиома Copy and swap является одним из подходов к реализации операции присваивания для объектов класса. Она предлагает эффективный способ обеспечить безопасную и эффективную реализацию этой операции. Используется для реализации оператора присваивания, конструктора копирования, обмена значениями.

Решаемые задачи

  • Безопасное присваивание объектов

При изменении состояния одного или нескольких объектов на любом этапе модификации может возникнуть исключительная ситуация, приводящая к неправильному освобождению ресурсов, если произошла ошибка после выделения памяти для нового объекта. Идиома Copy and swap обеспечитвает безопасность операции присваивания. Она позволяет избежать проблем с самоприсваиванием и гарантировать освобождение ресурсов.

Общая реализация на языке C++

Реализация идиомы заключается в создании функции swap(), которая:

  1. Создает копию объектов;

  2. Изменяет копию. Оригинальные объекты остаются нетронутыми;

  3. Если все изменения прошли успешно – происходит замена оригинального объекта измененной копией. Если же при изменении копии на каком-то этапе появилась ошибка, то оригинальный объект не меняется.

В данном примере для обмена значениями реализована функция swap(). Благодаря этому удается избежать утечки памяти в случае выброса исключения.

template<typename T>
class Array {
    public:
        Array(unsigned size) : data{ new T[size] }, size{ size } { }  
        ~Array() { delete [] data; } 

        Array(const Array& array) : Array{ array.size } {
            for (unsigned i {}; i < size; ++i)
                data[i] = array.data[i];
        }
        
        Array <T>& operator=(const Array& other) {
            Array <T> copy{ other };    
            swap(copy);                
            return *this;
        }

        T & operator[](unsigned index) 
        { 
            return data[index]; 
        }
        
        void swap(Array & other) noexcept  {
            std::swap(data, other.data);    // меняются два указателя
            std::swap(size, other.size);    // меняются размеры
        }
        
        unsigned getSize() const 
        { 
            return size;
        }
        
private:
    T * data;         
    unsigned size; 
};
PreviousDecltype (auto)NextSafe bool

Last updated 1 year ago

Was this helpful?