簡體   English   中英

將 shared_ptr 的向量復制到抽象基的派生類

[英]Copy vector of shared_ptr to derived classes of abstract base

我正在嘗試將派生類的 object 實例從vector<shared_ptr<base>>復制到新的vector<shared_ptr<base>> ,其中基礎 class 是抽象的。 我希望新vector包含shared_ptr到對象的副本,而不是原始對象。

我試過這個:

class base
{
public:
    base(){}
    virtual void method() = 0;
};

class derived1 : public base
{
public:
    derived1() : base() { };
    void method() {};
};

class derived2 : public base
{
public:
    derived2() : base() { };
    void method() {};
};

int main()
{
    std::vector<std::shared_ptr<base>> vector1 =
    {
        std::make_shared<derived1>(),
        std::make_shared<derived2>()
    };

    std::vector<std::shared_ptr<base>> vector2;
    vector2.reserve(vector1.size());
    for (const auto& e : vector1)
    {
        vector2.push_back(std::make_shared<base>(*e));
    }
}

這不起作用,因為我無法實例化基礎 class。 我怎樣才能正確地做到這一點?

解決此問題的一種方法是在基礎 class 上創建一個純虛擬克隆方法,該方法返回一個指針 - 子類覆蓋它以分配自己的副本。

class base
{
public:
    virtual std::shared_ptr<base> clone() const = 0;
};

class derived1 : public base
{
public:
    virtual std::shared_ptr<base> clone() const override
    {
        return std::shared_ptr<base>(new derived1(*this));
    }
};

暫無
暫無

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

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