gpt4 book ai didi

c++ - 将唯一指针指向共享指针是否可以?

转载 作者:太空狗 更新时间:2023-10-29 20:35:46 25 4
gpt4 key购买 nike

我在尝试解决 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。然后我会为 MyObject 的每个实例提供 m_p_my_resource。我假设每当 m_p_my_resource 更改为指向新的 MyResource 时,每个 MyObject 也会指向新资源。

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

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

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

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

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

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

最佳答案

如果 MyObject 的生命周期是真的s 与 MyClass 的生命周期相同然后是 MyObject 的每个实例可以改为保存指向 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 的内容:

void bar(MyClass& myClass) {
myClass.resource.reset(new MyResource());
assert(myClass.resource.get() == myClass.ob1.resource.get());
assert(myClass.resource.get() == myClass.ob1.resource.get());
}

关于c++ - 将唯一指针指向共享指针是否可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41203106/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com