引用现代C ++中的唯一指针

时间:2015-03-14 13:27:02

标签: c++ c++11

我有一个对象,Window,有一个成员std::unique_ptr<Texture>。我使用一个独特的指针,因为Window确实拥有纹理,并且在Window被破坏后使用所述纹理没有意义。

Window有一个方法Texture& Window::getTexture()。我们的想法是,有时候Window外部的代码会说myWindow.getTexture(),对纹理做一些事情,然后用它完成。

风险是有人抓住了纹理参考,在Window被破坏后它变得无效。我可以改为让窗口保持std::shared_ptr<Texture>std::weak_ptr<Texture> Window::getTexture()但是当Window是纹理的唯一所有者时,shared_ptr对我来说感觉不对,并且纹理永远不会比窗口更长。

我是否应该在这种情况下使用特定模式,或者是一种参考方式?在过去,我当然只会返回一个指针。

编辑:我可能正在思考这个,这是一个正常用法的例子

Texture& tex = myWindow.getTexture();
context.drawHere(tex);
context.drawThere(tex);
context.drawEverywhere(tex);

调用代码必须做一些非常不正常的事情来保持引用,通常你只是用它来进行一些绘制调用(它不能保留任何东西)。这是一个非问题,还是有一种我应该使用的模式,使其明确超出文档?

2 个答案:

答案 0 :(得分:4)

我喜欢Herb Sutter和其他人提出的方法,在接口中放置原始引用或指针,并使用智能指针进行所有权管理。您只需要确保接口的用户理解规则。

答案 1 :(得分:1)

也许,你不应该在你的类之外公开Texture并在Window中创建特定的方法,以便对他的纹理进行特定的操作。如果你不能这样做,那么你需要使用共享ptr,它更安全,并且不会对性能产生太大影响。

希望它有所帮助。