2012-09-20 192 views
2

的我有一个共享指针向量:矢量到矢量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来解决此问题,但应该有一个更简单的方法来实现此目的。

任何人都可以告诉我一个更好的方法将原始对象复制到返回的矢量吗?

+0

如果'描述符'是抽象的,你怎么能'std :: vector '?对于多态性,你需要有'std :: vector ' – Nick

+0

这个向量就像头文件中的那样,我将派生对象赋给它。我将用一个例子编辑 – Minion91

+0

嗯,这是C++ 11,所以也许我错过了新标准中发生了变化的东西...... – Nick

回答

4

由于它是抽象的,您不能制作描述符对象。

但是,您可以制作指向这些对象的指针的深层副本。

要做到这一点你的类描述符丢失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()); 
    } 
} 
1

我猜,当你正在使用shared_ptr s表示他们要么是大型对象存储你的对象和不应该被复制,或者它们代表某些事件的单个实例,这些实例不应该被复制。

在这种情况下,您最好只填写一个会阻止调用者修改指向对象的const指针向量。

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); 
    } 
} 
+0

由于管理它们的对象仍然需要更改它们,因此它们不能被设为const – Minion91

+0

您的意思是CatUpdater类吗?这仍然会保存非const的shared_ptr,它只是getDescriptorList的调用者,他将被赋予const shared_ptr的vector,因此无法操作它们。 – Nick

+1

想你!这应该可能做我想要实现的目标 – Minion91