有一个对象被认为是其组件(或数组/映射的情况下是项目)的所有者,但是仅删除它们而不构造它们,这是错误的设计?
例如,如果我有一个类的层次结构:
class A { public: virtual ~A() { } };
class A1 : public A { };
class A2 : public A { };
如果需要将A1和/或A2的多个实例存储到同一数组中并使用多态性(即
vector< A * >
),那么创建一个封装向量以删除元素的类是否是正确的设计?class ArrayOfA
{
private:
std::vector< A * > m_items;
public:
~ArrayOfA() { for( auto a : m_items ) delete a; }
void add( A * a ) { m_items.push_back( a ); }
};
然后使用如下:
ArrayOfA arr;
arr.add( new A1() );
arr.add( new A2() );
throw; // Do not care about release for RAII
问题是如果有人添加了其他人拥有的A。但是,如果在文档中明确指出ArrayOfA将其删除,则这应该不是问题。但是由于某种原因,感觉这种设计是有缺陷的。
我知道可以使用C ++ 11使用可变参数模板将A1或A2的构造函数的参数传递给ArrayOfA :: add(),以便该对象同时进行新建和删除,但是我不这样做想要使用它。
最佳答案
编辑
阅读问题。您不需要特殊的容器类。您需要向量std::unique_ptr
。