有一个对象被认为是其组件(或数组/映射的情况下是项目)的所有者,但是仅删除它们而不构造它们,这是错误的设计?

例如,如果我有一个类的层次结构:

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

10-06 02:38