Напишите конструктор копирования для
Foo, учитывая, что класс Foo принимает a и b во владение. Для тех, кто справился с предыдущей задачей: напишите operator= для класса FooИсходный код:
class Foo {
public:
Foo(A* a, B* b): a(a), b(b) {}
~Foo() {
delete a;
delete b;
}
// TODO: copy_ctor
private:
A* a;
B* b;
};Решение: Класс
Foo принимает владение сырыми указателями A* a и B* b. Необходимо выполнить глубокое копирование объектов A и B, чтобы избежать проблем с двойным удалением. Foo(const Foo& other) :
a(other.a ? new A(*other.a) : nullptr),
b(other.b ? new B(*other.b) : nullptr) {}. Проверяем other.a и other.b на nullptr перед копированием.
Создаем новые объекты A и B через копирующие конструкторы (
new A(*other.a)).Оператор присваивания: должен корректно обрабатывать самоприсваивание и освобождать старые ресурсы перед копированием новых.
Должен корректно обрабатывать самоприсваивание и освобождать старые ресурсы перед копированием новых.
Foo& operator=(const Foo& other) {
if (this != &other) { // Защита от самоприсваивания
delete a; // Освобождаем текущие ресурсы
delete b;
// Глубокое копирование
a = other.a ? new A(*other.a) : nullptr;
b = other.b ? new B(*other.b) : nullptr;
}
return *this;
}
Пояснение:
Проверка if (this != &other) исключает самоприсваивание (foo = foo).
Освобождаем текущие указатели a и b перед копированием новых значений.
Копируем объекты через new A(*other.a) (аналогично конструктору копирования).
class Foo {
public:
Foo(A* a, B* b): a(a), b(b) {}
~Foo() {
delete a;
delete b;
}
// Конструктор копирования
Foo(const Foo& other) :
a(other.a ? new A(*other.a) : nullptr),
b(other.b ? new B(*other.b) : nullptr) {}
// Оператор присваивания
Foo& operator=(const Foo& other) {
if (this != &other) {
delete a;
delete b;
a = other.a ? new A(*other.a) : nullptr;
b = other.b ? new B(*other.b) : nullptr;
}
return *this;
}
private:
A* a;
B* b;
};
@codeof_art