间接多级智能指针

时间:2012-01-11 10:50:34

标签: c++ smart-pointers

说,给出以下智能指针方案:

 weak_ptr<Style> A -> weak_ptr<Style> B -> shared_ptr<Style> C

你能否将第二个weak_ptr(B)更改为指向(观察)一个新的shared_ptr(C)的方式仍然会使第一个weak_ptr(A)看到新的更改的shared_ptr(C)?

希望这是有道理的。我想远离原始指针,因为在这种情况下,weak_ptr可以提供安全性。

修改

重新读取boost文档后,我意识到weak_ptr operator =基本上只是复制另一个weak_ptr而实际上并没有让它观察到另一个weak_ptr。所以如果没有原始指针你就不能拥有这种间接?

编辑2:

要扩展我的问题:我有LabelGlyphLabelGlyph的容器。标签具有shared_ptr<Style>,而字形对此样式具有weak_ptr。我打算允许快速更改样式而不实际迭代所有标签字形。所以我想在Label中使用另一种“主动”样式(如样式铅笔),并使所有字形指向那个铅笔。因此,每当我需要更改样式时,我只需将铅笔重新分配给新的Style对象。这可以只使用智能指针完成,还是需要在某个地方混合使用原始指针?

2 个答案:

答案 0 :(得分:1)

如果你的对象将shared_ptr设置为Style并且它们是相同的Style,那么它们之间会处理这个Style对象的生命周期。但请注意,它们共享对同一对象的引用,因此如果您修改样式,它们现在都将具有指向修改样式的指针。

如果你在某个地方有一些样式表,并且这是一个比你的物品更长的主要容器,那么除非存在他们可能需要保留引用的危险,否则你不需要你的物品有智能指针。这种风格,即使从表中删除它也会使用它,否则表格就会消失。

一般来说,暂时忘记这些方法并考虑对象所有权方面的问题。

答案 1 :(得分:1)

您不需要原始指针。 值得考虑您需要的行为模式。 一些建议是:

  1. 字形是标签内部的,当标签死亡时,它们不会暴露并死亡。 样式属性已更改,但样式实例是常量。 在这种模式中,在每个类中使用一个级别的shared_ptr是最简单的解决方案。 不用担心Glyph会延长样式的生命周期,所有shared_ptrs都会指向同一个实例。

  2. 字形是标签内部的,当标签死亡时,它们不会暴露并死亡。 样式实例可以更改。 在这种情况下,标签可以保存样式的代理(我认为你的铅笔概念是样式的代理),例如一个简单的类,它具有作为成员的样式的单个shared_ptr。代理应该保存在shared_ptr中。每个Glyph都可以将shared_ptr保存到代理的实例。

  3. 字形不在标签内部,它们是暴露的,即使标签已经死亡,也应该允许它们访问该样式。 #1和#2中的设计仍然有效。

  4. 字形不在标签内部,它们是暴露的,但不应导致样式的生命周期长于标签的生命周期。 在这种情况下,遵循#1或#2中的模式,除了Glyphs应该使用weak_ptr到样式(#1)或代理(#2)实例而不是样式/代理实例的shared_ptr。

  5. 如果您希望通过将shared_ptr与shared_ptr连接到代理(而不是编写自定义类)来实现代理,但这可能会使代码难以遵循。请注意,如果以这种方式嵌套,请注意模板类型,对于第二级,您实际需要shared_ptr<shared_ptr<Foo>>而不是shared_ptr<Foo>