复制传递给基类的shared_ptr

问题描述 投票:0回答:1

所以我有一个小的类层次结构,我需要将

shared_ptr
传递给接受 rvalue 的基类。但是,在其中一种情况下,我想获取
shared_ptr
以便在 衍生 类之一中使用。

我的问题简化为:

https://godbolt.org/z/Kvaa7o1Gn

class Base {
  public:
    Base(std::shared_ptr<int>&& p)
        : a_{p}
    {
    }

  private:
    std::shared_ptr<int> a_;
};

class Derived : public Base {
  public:
    Derived(std::shared_ptr<int> p)
        : Base(copy_shared_ptr(p)) // this is of course not permitted, but I'd like to do something like this
    {
    }

  private:
    std::shared_ptr<int> copy_shared_ptr(std::shared_ptr<int> p)
    {
        p_ = p; // segfaults
        std::cout << "Now p_ is " << p_.use_count() << std::endl;
        return p_;
    }

    std::shared_ptr<int> p_;
};

int main() { Derived d{std::make_shared<int>(5)}; }

在继续之前不可能抓住

shared_ptr
,因为我需要先构造我的 base 类,然后才能初始化它。 是否有我可能错过的明显的习惯用法来实现这一目标?

c++ inheritance smart-pointers
1个回答
1
投票

您可以将副本传递给

Base
,然后将原件存储在
p_

Derived(std::shared_ptr<int> p)
        : Base({p}), p_(std::move(p))
    {
    }
© www.soinside.com 2019 - 2024. All rights reserved.