我在尝试解决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
,我宁愿让它直接指向资源,而不是让它指向一个指向资源的中间指针......
所以我试图确定实现我描述的最佳方法。我对智能指针仍然比较陌生,如果我想做的事情是愚蠢的,或者是否有更好/更明显的替代解决方案,我很好奇。
答案 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_ptr
到shared_ptr
,就像你在标题中所说的那样。你在问题正文的任何地方都没有提到unique_ptr
,看起来你真正想要的是shared_ptr<unique_ptr<MyResource>>
,而不是unique_ptr<shared_ptr<MyResource>>
。