我已经远离严肃的C++大约十年了.我正在重新回到目前,我正在开展一个项目,以完全熟悉C++ 11.我有一个关于如何最好地传递std :: shared_ptr的存在主义危机.
举一个简单的例子,采取以下设置:
class ServiceB {
public:
ServiceB() {}
};
class ServiceA {
public:
ServiceA(std::shared_ptr<ServiceB>& serviceB)
: _serviceB(serviceB) {
}
private:
std::shared_ptr<ServiceB> _serviceB;
};
class Root {
public:
Root()
: _serviceB(std::shared_ptr<ServiceB>(new ServiceB())),
_serviceA(std::unique_ptr<ServiceA>(new ServiceA(_serviceB))) {
}
private:
std::shared_ptr<ServiceB> _serviceB;
std::unique_ptr<ServiceA> _serviceA;
};
Run Code Online (Sandbox Code Playgroud)
请注意,ServiceA需要引用ServiceB.我想将该引用保存在shared_ptr中.我可以做我在这里做的事情,这只是将shared_ptr作为参考传递下去,让std :: shared_ptr复制构造函数为我工作吗?这是否正确地增加了shared_ptr上的引用计数?
如果这不是最好的方法,那么传递std :: shared_ptr的常见"最佳实践"是什么?
Ben*_*ley 13
您应该在传递其他对象时准确传递共享指针.如果需要存储副本(共享指针的副本,而不是指向的对象),则按值传递,并移动到其目标.
ServiceA(std::shared_ptr<ServiceB> serviceB)
: _serviceB(std::move(serviceB)) {}
Run Code Online (Sandbox Code Playgroud)
或者,如果你不介意编写两个构造函数,你可以通过编写一个带有const引用并复制它的一个来保存一点性能(一次调用共享指针的移动构造函数),另一个带r-值引用,并移动它.
ServiceA(std::shared_ptr<ServiceB> const& serviceB)
: _serviceB(serviceB) {}
ServiceA(std::shared_ptr<ServiceB> && serviceB)
: _serviceB(std::move(serviceB) {}
Run Code Online (Sandbox Code Playgroud)