簡體   English   中英

抽象類的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);
    }
}

現在的問題是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());
    }
}

我猜想在您使用shared_ptr存儲對象時,它們要么是大對象並且不應被復制,要么它們代表某些東西的單個實例,而這些實例又不應被真正復制。

在這種情況下,最好填充一個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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM