При глубоком копировании новый объект получает собственный динамический ресурс с тем же содержимым. В присваивании сначала создайте копию и только после успеха заменяйте старый ресурс.
Создание класса с поддержкой глубокого копирования
При глубоком копировании новый объект получает собственный динамический ресурс с тем же содержимым. В присваивании сначала создайте копию и только после успеха заменяйте старый ресурс.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо написать класс, у которого определён пользовательский конструктор копирования и оператор присваивания, правильно работающие с полями, размещёнными в динамической памяти.
class CustomClass {
// поля с динамической памятью
// реализовать глубокое копирование
};
Ответ
При глубоком копировании новый объект получает собственный динамический ресурс с тем же содержимым. В присваивании сначала создайте копию и только после успеха заменяйте старый ресурс.
#include <memory>
#include <utility>
class CustomClass {
std::unique_ptr<int> data;
public:
explicit CustomClass(int value) : data(std::make_unique<int>(value)) {}
CustomClass(const CustomClass& other)
: data(other.data ? std::make_unique<int>(*other.data) : nullptr) {}
CustomClass& operator=(const CustomClass& other) {
if (this != &other) {
auto copy = other.data ? std::make_unique<int>(*other.data) : nullptr;
data = std::move(copy);
}
return *this;
}
CustomClass(CustomClass&&) noexcept = default;
CustomClass& operator=(CustomClass&&) noexcept = default;
~CustomClass() = default;
};
unique_ptr отвечает за освобождение памяти. Если создание копии бросит исключение, прежнее data сохранится. Пустое состояние после перемещения также корректно копируется, а самоприсваивание безопасно.