std :: shared_ptr - 将共享指针作为参数传递的最佳实践

Mat*_*mes 10 c++ c++11

我已经远离严肃的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)

  • @ Cheersandhth.-Alf:如果移动构建共享指针调整引用计数,那么这不是严重无能的实现的标志吗?我无法想象为什么它是必要的. (2认同)
  • @ Cheersandhth.-Alf:我的回答只适用于*"如果你需要存储副本"* - 它就在那里,在第二句中.如果您需要存储5份副本,则必须制作5份副本,并且引用计数将增加5次.通过const引用获取参数不会改变这一事实.如果你*不需要任何副本,那么这个习惯用法不适用于你的情况,你应该通过引用const(或非const,取决于你的需要)来获取参数.这很好玩. (2认同)