我和成员一起上课
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
作为参数传递吗?
答案 0 :(得分:2)
shared_ptr
的每个副本都是可用来访问共享库的句柄。您可以传递对shared_ptr
或其副本的引用,并将其副本存储在集合中。 shared_ptr
的副本引用相同的基础对象。当引用同一基础对象的最后一个shared_ptr
被销毁时,基础对象也被销毁。