获取预先创建的值的所有者对象?设计错误

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

本文关键字:错误 对象 创建 获取 所有者      更新时间:2023-10-16

如果一个对象被视为其组件(或数组/映射中的项)的所有者,但只删除它们,而不构建它们,这是错误的设计?

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

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(),这样对象就可以进行new和delete,但我不想使用它。

编辑

阅读问题。您不需要特殊的容器类。你需要一个std::unique_ptr的向量。

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

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

对于C++,请使用

std::<unique_ptr>

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

使用

std::<shared_ptr> 

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

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