是否可以使用指向共享指针的唯一指针?

时间:2016-12-17 21:10:21

标签: c++ pointers

我在尝试解决C ++中的指针问题时遇到了一些困难。

假设我有一个名为MyClass的课程。在这个类中,有一个共享指针指向一些名为MyResource的外部资源。现在让我们也说在MyClass内,有一些名为MyObject的对象实例。 MyObject的每个实例也需要引用MyResource。让我们假设这个类没有做任何事情,除了包含我刚才提到的那些组件

class MyClass
{
    shared_ptr<MyResource> m_p_my_resource;
    MyObject m_my_object1;
    MyObject m_my_object2;
    MyObject m_my_object3;
}

我之前(尝试)如何实现这一点,我将创建一个共享指针并将其提供给m_p_my_resource。然后,我会将m_p_my_resource提供给MyObject的每个实例。我假设每当m_p_my_resource更改为指向新的MyResource时,每个MyObject s也会指向新资源。

然而,我意识到我所做的并不正确。当我改变m_p_my_resource时,这确实会指向一个新的资源。但是,MyObject的每个实例仍将指向原始MyResource

现在我正在尝试考虑如何实际实现我最初尝试的方法:能够更改m_p_my_resource并让每个实例也指向新资源。

解决此问题的一种方法是在MyObject更改时更新m_p_my_resource的每个实例。我可能需要setResource方法更新m_p_my_resource,然后遍历MyObject的每个实例。

另一种解决方案是让MyObject的每个实例都包含指向MyResource指针的指针。因此,如果每个MyObject指向指向资源的指针而不是资源本身,我可以更改m_p_my_resource,每个对象也可以确定新资源。

虽然第二种方法可能适用于上面列出的类示例,但对于MyObject未包含在类中的实例而言,它并不优雅。就像在,如果我只是在堆栈上创建一个MyObject,我宁愿让它直接指向资源,而不是让它指向一个指向资源的中间指针......

所以我试图确定实现我描述的最佳方法。我对智能指针仍然比较陌生,如果我想做的事情是愚蠢的,或者是否有更好/更明显的替代解决方案,我很好奇。

2 个答案:

答案 0 :(得分:3)

如果MyObject的生命周期与MyClass的生命周期相同,那么MyObject的每个实例都可以保存一个引用或指针{{1}实现你想要的。

shared_ptr<...>

您可以安全地更改class MyClass { public: shared_ptr<MyResource> resource; MyObject obj1 { resource }; MyObject obj2 { resource }; }; class MyObject { public: shared_ptr<MyResource>& resource; void foo() { resource->do_something(); // works transparently } } 的内容:

MyClass::resource

答案 1 :(得分:2)

双指针是解决问题的正确方法。

但是,我有点困惑为什么你想要一个unique_ptrshared_ptr,就像你在标题中所说的那样。你在问题正文的任何​​地方都没有提到unique_ptr,看起来你真正想要的是shared_ptr<unique_ptr<MyResource>>,而不是unique_ptr<shared_ptr<MyResource>>