采用预创建值的所有者对象?错误的设计?

Owner object that takes pre-created values ? Wrong design?

将对象视为其组件(或数组/映射中的项)的所有者但仅删除它们是错误的设计不构建它们 ?

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

class A { public: virtual ~A() { } };
class A1 : public A { };
class A2 : public A { };

并且如果需要将 A1 and/or A2 的多个实例存储到同一个数组中并使用多态性(即 vector< A * >),创建一个 class 是否是正确的设计封装vector删除元素 ?

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() 以便对象同时进行新建和删除,但我不想使用它。

编辑

阅读问题。您不需要特殊的容器 class。您需要 std::unique_ptr.

的矢量

所有权就是这样。即删除对象的责任。它并不暗示甚至鼓励拥有实体创建拥有实体。

只要所有权以明显的方式传递,在其他地方进行创作是完全可以的。

对于 C++,使用

std::<unique_ptr>

而不是文档来明确这一点。它还将允许您的代码执行自动清理。

使用

std::<shared_ptr> 

权属不明时。即不确定或不清楚哪个实体最终应该实际删除该对象。

有关智能指针的更多信息,请阅读。 https://en.wikipedia.org/wiki/Smart_pointer