gpt4 book ai didi

c++ - 抽象类的 shared_ptr vector 到拷贝 vector

转载 作者:搜寻专家 更新时间:2023-10-31 00:41:59 24 4
gpt4 key购买 nike

我有一个带有共享指针的 vector :

std::vector<std::shared_ptr<DescriptorsNs::Descriptor> > mDescriptorList;

现在我想要一个 getter 函数,它返回一个包含这些对象拷贝的 vector :

void CatUpdater::getDescriptorList(std::vector<Descriptor*>& descriptorList) const
{
descriptorList.clear();
for (auto it = mDescriptorList.begin(); it != mDescriptorList.end(); it++)
{
descriptorList.push_back(*it);
}
}

现在的问题是 Descriptor 是一个抽象类,当我尝试将它们添加到 vector 时,它正确地指出:

/usr/include/c++/4.7/ext/new_allocator.h|110|error: cannot allocate an object of abstract type ‘DescriptorsNs::Descriptor’|

我可以通过对所有类型的派生类尝试 std::dynamic_pointer_cast 来解决这个问题,但应该有更简单的方法来实现这一点。

谁能告诉我将原始对象复制到返回 vector 的更好方法?

最佳答案

你不能创建 Descriptor 对象,因为它是抽象的。

但是您可以对指向这些对象的指针进行深度复制。

为此,您的类 Descriptor 缺少 clone 虚拟方法!

将它添加到您的类中并在您的派生类中正确实现。

class Descriptor {
...
virtual Descriptor* clone() const = 0;
};


class SomeDescriptor : public Descriptor {
...
virtual Descriptor* clone() const { return new SomeDescriptor (*this); }
};

并在将一个 vector 深度复制到另一个 vector 时使用 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());
}
}

关于c++ - 抽象类的 shared_ptr vector 到拷贝 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12515374/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com