我怀疑这是不可能的,但在下面创建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 :(得分:1)
* SNIP - 在澄清情景后,我在最初的评论中发布了这个答案*
这个怎么样?在您的堆栈中,存储unique_ptrs。当你从堆栈弹出时,你从unique_ptr中获取原始指针并将其推入另一个unique_ptr - 第二个是使用自定义删除器声明的,在删除时,它会保留堆栈的位置并执行弹出操作的反向操作。这也适用于shared_ptr,但显然这取决于你需要什么。
它独立于B的类型,可以完全封装在堆栈类中(除了unique_ptr + deleter类型,但这只是一个typedef)。
答案 1 :(得分:0)
不是按值存储data2
,而是使用指针存储它并在构造函数中分配它。这样,当您删除B
时,它就不会被删除(除非您在delete
析构函数中调用Derived2
)。