初始化由成员函数参数传递的shared_ptr

时间:2016-01-12 06:27:01

标签: c++ c++11

我希望有人可以帮我解决这个问题。这里的问题。 我有一个共享库(.so,.dll,.dynlib)。在该库中,存在某种创建对象的工厂类。例如,我的方法看起来像这样:

class RenderSystem {
    public:
        int createTexture(Texture** texture, ...);
        ....
}

createTexture类中的RenderSystem方法如下所示:

int createTexture(Texture** texture, ...) {
    ....
    *texture = new ...
    return someErrorCode;
}

它正在创建Texture实例并将指针传递给texture参数。我们知道在共享库中创建的实例必须在同一个库中销毁。所以我有删除/破坏这些纹理的方法。

我喜欢将shared_ptr用于所有这些,但我必须将返回值保持为整数。在不更改方法的返回类型的情况下返回std::shared_ptr<Texture>的正确方法是什么。传递对std::shared_ptr<Texture>的引用是否安全,还是必须将方法的返回值更改为std::shared_ptr<Texutre>?所以可以这样做:

int createTexture(std::shared_ptr<Texture>& texture, ...) {
    ....
    texture = std::shared_ptr<....>(...) or std::make_shared<...>(..);
    return someErrorCode;
}

希望我能描述一下这个问题。

1 个答案:

答案 0 :(得分:3)

  

传递参考是否安全??

是的,使用您描述的技术并不罕见,通常称为按引用返回(或 call-by-reference )。

对于某些系统和约定,引用参数的返回位于方法签名的末尾 - 但这是一个偏好,并没什么区别。

  

...或者我是否必须更改方法的返回值...?

需要更改返回类型的替代方法是:

  • 将返回类型扩展为某种std::tuplestd::pair

  • 最好的方法是返回std::shared_ptr并在错误情况下抛出异常。

替代方案需要改变回报类型,这不是你要求的,而是值得一提的替代方案。