Я подозреваю, что это невозможно, но в приведенной ниже ситуации, создав 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?
*SNIP — После прояснения сценария я отправил этот ответ в комментарии изначально *
Как насчет этого. В вашем стеке храните unique_ptrs. Когда вы извлекаете из стека, вы берете необработанный указатель из unique_ptr и помещаете его в другой unique_ptr — этот второй объявляется с пользовательским средством удаления, которое при уничтожении сохраняет местоположение стека и выполняет обратную операцию pop , Это также будет работать с shared_ptr, но, очевидно, это зависит от того, что вам нужно.
Он не зависит от типа B и может быть полностью инкапсулирован в класс стека (за исключением типа unique_ptr + deleter, но это будет просто определение типа).
Вместо хранения data2
по значению сохраните его с помощью указателя и разместите в конструкторе. Таким образом, он не будет удален при удалении B
(если вы не позвоните delete
внутри Derived2
деструктор).