将shared_ptr传递给函数-需要澄清

时间:2018-10-16 20:33:41

标签: c++

我和成员一起上课

vector<shared_ptr<ParticleSystem>> particleSystems;

具有方法

void AddParticleSystem(shared_ptr<ParticleSystem> const sys)
{
    particleSystems.push_back(sys);
}

注意参数。 该方法的调用方式如下:

shared_ptr<ParticleSystem> psys = make_shared<ParticleSystem>(...);
scene.AddParticleSystem(psys);

它有效,但是为什么呢?不会共享吗?


默认情况下,我不尝试传递指针。在考虑函数参数时,如果不想更改传递的变量上的任何内容,请使用const&;如果计划使用将更改给定变量成员的方法,请使用&

因此,默认情况下,我实现了上述方法,如下所示:

void AddParticleSystem(ParticleSystem const& sys)
{
    particleSystems.push_back(std::make_shared<ParticleSystem>(sys));
}

我这样称呼

shared_ptr<ParticleSystem> psys = make_shared<ParticleSystem>(...);
scene.AddParticleSystem(*psys);

这一次它没有编译,说明

  

错误C2280'物理:: ParticleSystem :: ParticleSystem(const   Physics :: ParticleSystem&)':尝试引用已删除的   功能

我使用Output(使用VS)追溯了问题,这导致了我

particleSystems.push_back(std::make_shared<ParticleSystem>(sys));
确切地说,是{p> make_shared方法。

现在,此ParticleSystem扩展了Visual,它具有类似的构造函数和成员

Visual(string const &name, string const &path, const char* vertexPath, const char* fragmentPath, const char* geometryPath = nullptr, bool gamma = false)
{
    this->name = string().append(name);
    model = make_unique<Model>(path, gamma);
    material = make_unique<Material>();
    shader = make_unique<Shader>(vertexPath, fragmentPath, geometryPath);
}

unique_ptr<Shader> shader;
unique_ptr<Material> material;
unique_ptr<Model> model;
virtual ~Visual() = default;

我得到make_shared需要以某种方式复制内容。是ParticleSystem的{​​{1}}拥有Visual个成员并且默认情况下unique_ptr不知道如何对待他们的问题吗?

这是编译器删除默认副本构造函数的原因吗?如果是这样,如果我为make_shared拥有的所有类(包括自身)实现一个复制构造函数,我可以将该Visual作为参数传递吗?

1 个答案:

答案 0 :(得分:2)

shared_ptr的每个副本都是可用来访问共享库的句柄。您可以传递对shared_ptr或其副本的引用,并将其副本存储在集合中。 shared_ptr的副本引用相同的基础对象。当引用同一基础对象的最后一个shared_ptr被销毁时,基础对象也被销毁。