Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 间接多级智能指针_C++_Smart Pointers - Fatal编程技术网

C++ 间接多级智能指针

C++ 间接多级智能指针,c++,smart-pointers,C++,Smart Pointers,假设采用以下智能指针方案: weak_ptr<Style> A -> weak_ptr<Style> B -> shared_ptr<Style> C 弱ptr A->弱ptr B->共享ptr C 您能否将第二个弱ptr(B)更改为指向(观察)一个新的共享ptr(C),使第一个弱ptr(a)仍能看到新更改的共享ptr(C) 希望这是有道理的。考虑到在这种情况下ptr所能提供的安全性,我希望远离原始指针 编辑: 在重新阅读boost文档之后,

假设采用以下智能指针方案:

 weak_ptr<Style> A -> weak_ptr<Style> B -> shared_ptr<Style> C
弱ptr A->弱ptr B->共享ptr C
您能否将第二个弱ptr(B)更改为指向(观察)一个新的共享ptr(C),使第一个弱ptr(a)仍能看到新更改的共享ptr(C)

希望这是有道理的。考虑到在这种情况下ptr所能提供的安全性,我希望远离原始指针

编辑:

在重新阅读boost文档之后,我意识到弱ptr操作符=实际上只是复制了另一个弱ptr,而不是让它观察另一个弱ptr。没有原始指针就不能进行这种间接操作

编辑2:


进一步说明我的问题:我有一个
标签
和一个
字形
标签是
字形的容器。标签有一个
共享的\u ptr
,标志符号有一个
弱的\u ptr
。我的目的是允许快速更改样式,而无需实际迭代所有标签图示符。所以我在考虑在
标签中使用另一种“活动”样式(如样式铅笔),并使所有符号都指向铅笔。所以,每当我需要更改样式时,我只需将pencil重新指定给一个新的样式对象。这只能通过智能指针实现,还是我需要在某个地方混合一个原始指针?

如果您的对象共享了某个样式的ptr,并且该样式是相同的样式,那么它们之间会处理该样式对象的生存期。但是请注意,它们共享对同一对象的引用,因此如果修改样式,所有这些对象现在都将具有指向修改样式的指针

如果您在某个地方有一些样式表表,而这是超出您的项的主容器,那么您不需要您的项具有智能指针,除非存在这样的危险,即它们可能需要保留对该样式的引用,并在该样式从表中删除或该表消失后使用它


一般来说,暂时忘记如何,想想对象所有权方面的问题。

您不需要原始指针。 你需要什么样的行为模式值得考虑。 有些建议是:

  • 标志符号是标签内部的,当标签消失时,它们不会暴露并消失。 样式属性已更改,但样式实例保持不变。 在这种模式中,在每个类中只使用一级共享的ptr是最简单的解决方案。 不必担心Glyph会延长样式的生命周期,所有共享的ptr都会指向同一个实例

  • 标志符号是标签内部的,当标签消失时,它们不会暴露并消失。 样式实例可以更改。 在这种情况下,label可以保存样式的代理(我认为您的铅笔概念是样式的代理),例如,一个简单的类,它有一个作为成员的样式的共享ptr。代理应保存在共享的ptr中。每个Glyph都可以保存一个到代理实例的共享ptr

  • 标志符号不是标签的内部标志,它们是暴露的,即使标签已消失,也应允许它们访问样式。 #1和#2中的设计仍然有效

  • 标志符号不是标签的内部标志,它们是公开的,但不应导致样式的生存期长于标签的生存期。 在这种情况下,请遵循#1或#2中的模式,但图示符应该对样式(#1)或代理(#2)实例使用弱ptr,而不是对样式/代理实例使用共享ptr


  • 如果您想实现代理,您可以通过将shared_ptr转换为shared_ptr转换为代理(而不是编写自定义类)来实现代理,但这可能会使代码难以理解。注意,如果以这种方式嵌套,请小心模板类型,对于第二级,您实际上想要的是
    共享的ptr
    ,而不是
    共享的ptr

    ,对不起,但对我来说这毫无意义-您能用代码表达您的意图吗?用更多信息更新了问题:)您的回答让我再次审视了我的字形设计。是的,glyph观察任何样式对象都没有意义。glyph只需要用于绘图的样式,这样就可以通过函数参数传递。