我有一个带有共享指针的向量:
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);
}
}
现在的问题是 Descriptor 是一个抽象类,当我尝试将它们添加到向量中时,它正确地指出:
/usr/include/c++/4.7/ext/new_allocator.h|110|error: cannot allocate an object of abstract type ‘DescriptorsNs::Descriptor’|
我可以通过尝试解决这个问题std::dynamic_pointer_cast
对于所有类型的派生类,但应该有一种更简单的方法来实现这一点。
谁能告诉我一种将原始对象复制到返回向量的更好方法?
您不能创建 Descriptor 对象,因为它是抽象的。
但是您可以制作指向这些对象的指针的深层副本。
为此,您的班级描述符丢失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());
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)