2012-01-11 65 views
0

说,鉴于以下智能指针方案:间接多层次的智能指针

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运营商=本质上只是复制另一个weak_ptr的,而不是真正使得观察其他的weak_ptr。所以你不能没有原始指针就有这种间接性?

编辑2:

为了扩大我的问题:我有一个LabelGlyph。 A LabelGlyph的容器。一个标签有shared_ptr<Style>,字形有weak_ptr这种风格。我的意图是允许对样式进行快速更改,而不用实际遍历所有标签字形。所以我在考虑在Label中有另一种“积极”的风格(如风格铅笔),并让所有的字形指向铅笔的东西。所以无论什么时候我需要更改样式,我只需将铅笔重新分配给新的Style对象。这可以只用智能指针来完成,或者我需要在某个地方混合一个原始指针?

+2

我很抱歉,但对我来说这没有意义 - 你能表达你的意图吗? – 2012-01-11 10:55:12

+0

用更多的信息更新了这个问题:) – Sim 2012-01-11 11:25:45

回答

1

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

如果您有样式表的一些表的地方,这是会超越你的项目的主容器,那么你就不需要你的项目有智能指针,除非有一种危险是,他们可能需要保持一个参考以这种风格,甚至在它从表格中移除或表格消失后使用它。

一般来说,暂时忘掉目前的情况,并考虑对象所有权的含义。

+0

你的回答让我再次看到了我的字形设计。而且,对于字形而言,观察任何样式对象都没有任何意义。一个字形只需要一种绘制风格 - 这样可以通过函数参数传递。 – Sim 2012-01-11 12:13:32

1

你不需要原始指针。 值得考虑你需要什么样的行为模式。 提出了一些建议:

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

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

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

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

如果你想,你可以通过具有一个shared_ptr的shared_ptr的一个代理(而不是编写自定义类)实现代理,但是这可能使代码难走。请注意,如果以这种方式嵌套要小心模板类型,对于第二个层次,您实际上需要shared_ptr<shared_ptr<Foo>>而不是shared_ptr<Foo>