抽象类的shared_ptr向量到副本的向量
vector of shared_ptr of abstract class to vector of copys
我有一个带有共享指针的向量:
std::vector<std::shared_ptr<DescriptorsNs::Descriptor> > mDescriptorList;
现在我想要一个 getter 函数,它返回一个包含这些对象副本的向量:
void CatUpdater::getDescriptorList(std::vector<Descriptor*>& descriptorList) const
{
descriptorList.clear();
for (auto it = mDescriptorList.begin(); it != mDescriptorList.end(); it++)
{
descriptorList.push_back(*it);
}
}
现在的问题是描述符是一个抽象类,当我尝试将它们添加到向量中时,它正确地指出:
/usr/include/c++/4.7/ext/new_allocator.h|110|error: cannot allocate an object of abstract type ‘DescriptorsNs::Descriptor’|
我可以通过尝试对所有类型的派生类进行std::dynamic_pointer_cast
来解决此问题,但应该有一种更简单的方法来实现这一点。
谁能告诉我将原始对象复制到返回的向量的更好方法?
你不能制作描述符对象,因为它是抽象的。
但是,您可以创建指向这些对象的指针的深层副本。
为此,您的类描述符缺少虚拟方法clone
!
将其添加到您的类中并在您的派生中正确实现。
class Descriptor {
...
virtual Descriptor* clone() const = 0;
};
class SomeDescriptor : public Descriptor {
...
virtual Descriptor* clone() const { return new SomeDescriptor (*this); }
};
并使用clone(),同时将一个向量深度复制到另一个向量:
void CatUpdater::getDescriptorList(std::vector<std::shared_ptr<DescriptorsNs::Descriptor> >& descriptorList) const
{
descriptorList.clear();
descriptorList.reserve(mDescriptorList.size());
for (auto it = mDescriptorList.begin(); it != mDescriptorList.end(); it++)
{
descriptorList.push_back((*it)->clone());
}
}
我猜当你使用shared_ptr
存储你的对象时,它们要么是大对象,不应该被复制,要么它们代表一些东西的单个实例,同样不应该被复制。
在这种情况下,您最好只填充一个常量指针向量,这将阻止调用者修改指向的对象。
typedef std::shared_ptr<const Descriptor> ConstSharedPtr;
void CatUpdater::getDescriptorList(
std::vector<ConstSharedPtr>& descriptorList
) const
{
descriptorList.clear();
for (auto it = mDescriptorList.begin(); it != mDescriptorList.end(); it++)
{
descriptorList.push_back(it);
}
}
相关文章:
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- 构造字符串向量时是否有任何副本?
- 替代STD ::向量存储参考而不是对象的副本
- 构造向量时如何摆脱(一个)不必要的副本
- 在一个映射向量上迭代,如果满足条件,则插入一个副本
- 抽象类的shared_ptr向量到副本的向量
- 是否可以将向量初始化为附加额外元素的另一个向量的副本
- 指针是否可能在没有任何数据副本的情况下被向量所拥有
- 创建由shared_pointers向量的元素所指向的对象的副本
- 用向量本身的副本交换向量
- 如何在构造具有不同类型元素的向量副本时显式转换
- 对指针向量进行排序会更改该向量副本中的数据
- 如何在基类的向量中返回派生对象的副本