2012-09-20 138 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