У меня есть два класса:
class NonCopyable {
private:
int key;
protected:
NonCopyable(const NonCopyable&) = delete;
NonCopyable& operator = (const NonCopyable &) = delete;
};
class Derived : public NonCopyable {
private:
std::vector<int> numbers;
float f;
int* ptr;
public:
Derived() : f(5.0f), ptr(nullptr) {}
~Derived();
};
Теперь я хотел бы повторно инициализировать все значения в Производный Класс и вызвать соответствующие деструкторы. Это NonCopyable класс не должен быть затронут, но Производный класс должен быть изменен, как если бы он был заново инициализирован.
Какой самый простой способ достижения этой цели? Я пытаюсь избежать создания функции-члена, которая вручную повторно инициализирует каждую переменную-член.
Понятно, что я не могу использовать следующий подход:
Derived d;
// [...] many changes to d
d = Derived();
потому что конструктор копирования удаляется из NonCopyable класс и тот факт, что это изменит переменные-члены NonCopyable если бы это было не так.
Это станет намного проще, если вы переместите ваши личные данные в отдельный агрегат:
struct DerivedData {
std::vector<int> numbers;
float f = 5.0;
int* ptr = nullptr;
};
class Derived : public NonCopyable {
DerivedData data;
public:
~Derived();
void reset() { data = DerivedData(); }
};
Других решений пока нет …