获取预先创建的值的所有者对象?设计错误
Owner object that takes pre-created values ? Wrong design?
如果一个对象被视为其组件(或数组/映射中的项)的所有者,但只删除它们,而不构建它们,这是错误的设计?
例如,如果我有一个类的层次结构:
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
相关文章:
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 模板,函数使用错误的构造函数来复制我的对象
- 有没有办法让编译器在我放置字符串而不是 nlohmann::json 对象时抛出错误?
- std::unordered_map 类型对象声明期间出现"field has incomplete type"错误
- 错误:malloc:对象 0x7f9edf504080 的 *** 错误:未分配正在释放的指针
- 从对象C++中的文件读取内容时出现分段错误
- cout 新创建的对象引发运行时错误
- 错误:"释放后使用包装器对象 (WRAPPER_ESCAPE)"
- 使用返回对象的函数处理错误
- 创建 QtChart 对象会在运行时创建EXC_BAD_ACCESS错误
- 错误:无法传递非平凡类型"std::string"的对象和更多错误
- 该对象具有与成员函数不兼容的类型限定符.为什么会出现此错误?
- 如何在类模板的成员函数中正确调用函数对象?正在生成 Visual Studio 编译器错误 C2440
- 尝试将对象插入空指针数组时出现分段错误
- 错误:三元运算符无法在对象中正常工作"cout"
- C++:如果括号为空,为什么不抛出错误对象?
- qt vsaddin错误对象引用未设置为对象的istanse
- 如何从函数返回成功或错误对象?
- 复制构造函数错误:对象的类型限定符与成员函数不兼容
- 如何在本机插件中创建node.js错误对象