采用预创建值的所有者对象?错误的设计?
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
将对象视为其组件(或数组/映射中的项)的所有者但仅删除它们是错误的设计不构建它们 ?
例如,如果我有一个 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