【发布时间】:2015-03-14 13:27:01
【问题描述】:
我有一个对象 Window,它有一个成员 std::unique_ptr<Texture>。我使用了一个唯一的指针,因为 Window 真正拥有纹理,并且在 Window 被销毁后使用该纹理没有意义。
Window 有一个方法,Texture& Window::getTexture()。这个想法是有时 Window 外部的代码会说 myWindow.getTexture(),对纹理做一些事情,然后再完成它。
风险在于有人持有纹理引用,该引用在 Window 销毁后变得无效。我可以让 window 持有 std::shared_ptr<Texture> 和 std::weak_ptr<Texture> Window::getTexture(),但是当 Window 是纹理的唯一所有者时,shared_ptr 对我来说感觉不对,而且纹理永远不会超过 Window。
在这种情况下我应该使用什么特定的模式,还是参考方法?在过去,我当然只会返回一个指针。
编辑:我可能想多了,这里是一个正常用法的例子
Texture& tex = myWindow.getTexture();
context.drawHere(tex);
context.drawThere(tex);
context.drawEverywhere(tex);
调用代码必须做一些非常异常的事情来保持引用,通常你只是将它用于几个绘图调用(不保持任何东西)。这是一个非问题,还是我应该使用某种模式在文档之外明确说明这一点?
【问题讨论】:
-
无论调用 getTexture 都应该拥有纹理,那么这不是问题
-
也许会返回一个普通的旧指针,并记录当
Window超出范围时它将失效? -
@juanchopanza:但这是否避免了OP提到的风险? IE。在
Window被销毁后,有人保留了原始指针。当然,他们必须为此忽略文档。但他们也会在引用的情况下这样做,因为引用是关于这个特定所有权问题的一种自我记录,不是吗? -
Window::updateTexture(std::unique_ptr<Texture> ptr)然后reset怎么样? -
我认为这个问题无法真正回答,只要我们不知道谁会打电话给
getTexture,出于什么目的。