Предотвращение уничтожения переменных-членов

Я подозреваю, что это невозможно, но в приведенной ниже ситуации, создав A и B, я хотел бы повторно использовать B (помещая его в стек, готовый к повторному использованию), но удаляя A. Это два из многих классов, производных от родительского класса. и я хотел бы, чтобы код, отвечающий за удаление объектов, мог вести себя одинаково для всех производных объектов.

Можно ли переопределить оператор деструктора / удаления Derived2 так, чтобы деструктор data2 не вызывался? Тогда было бы несложно поместить B в стек со всеми данными, выделенными во время его построения, готовыми для повторного использования.

(РЕДАКТИРОВАТЬ: Для пояснения, я хочу повторно использовать B, который имеет большое количество переменных-членов различных типов в зависимости от того, какой производный класс участвует. Я действительно оценил все предложения, но я использовал очень простой пример, чтобы выяснить, был ли этот конкретный подход возможно, и потому что фактические классы содержат огромное количество дополнительного кода, не имеющего отношения к рассматриваемому вопросу)

class Parent{
...
};

class Derived1:Parent{
DataClass data1;
};

class Derived2:Parent{
DataClass data2;
};

Derived1* A = new Derived1();
Derived2* B = new Derived2();
delete A;
delete B;

Будет ли это (если это возможно) считаться нарушением схемы проектирования RAII?

0

Решение

*SNIP — После прояснения сценария я отправил этот ответ в комментарии изначально *

Как насчет этого. В вашем стеке храните unique_ptrs. Когда вы извлекаете из стека, вы берете необработанный указатель из unique_ptr и помещаете его в другой unique_ptr — этот второй объявляется с пользовательским средством удаления, которое при уничтожении сохраняет местоположение стека и выполняет обратную операцию pop , Это также будет работать с shared_ptr, но, очевидно, это зависит от того, что вам нужно.

Он не зависит от типа B и может быть полностью инкапсулирован в класс стека (за исключением типа unique_ptr + deleter, но это будет просто определение типа).

1

Другие решения

Вместо хранения data2 по значению сохраните его с помощью указателя и разместите в конструкторе. Таким образом, он не будет удален при удалении B (если вы не позвоните delete внутри Derived2 деструктор).

0

По вопросам рекламы [email protected]