gpt4 book ai didi

c++ - 指针共享习语

转载 作者:行者123 更新时间:2023-11-30 05:34:58 26 4
gpt4 key购买 nike

在一般情况下,我无法想出一种方法来做到这一点。假设我有 2 个类,它们维护着彼此的指针:

class first {
unique_ptr<second> p2;
public:
first() : p2(this) {}
};

class second {
first* p1;
public:
second(first* arg) : p1(arg) {}
};

这一切都很好,但我真正想要的是使用 shared_ptr 作为 second 的一部分,因为 second 对象可能也可以独立于 first 创建。他们只会在构造时被传递一个指向 first 的指针,但他们不知道它是否消失了。

我不能只让 second::p1 成为 shared_ptr 因为我不知道如何从 传入 this >first::first().

有什么成语可以帮助我处理这个问题吗?

最佳答案

需要注意的是,您只能在堆上创建实例。使用 std::shared_from_this 将是一个很好的解决方案,但它只能在对象的 std::shared_ptr 存在时调用,这在构造函数完成之前是不可能的,即使在使用 std::make_shared 时也会抛出 std::bad_weak_ptr 异常。

相反,我们确保创建此类实例的唯一方法是通过执行必要设置的静态函数。

#include <cassert>
#include <memory>

class second;

class first {
struct Unconstructable {};
std::unique_ptr<second> p2;
public:
first(Unconstructable) : p2() {}
static std::shared_ptr<first> create() {
Unconstructable u;
auto f = std::make_shared<first>(u);
f->p2 = std::make_unique<second>(f);
return f;
}
};

class second {
std::shared_ptr<first> p1;
public:
second(std::shared_ptr<first> arg) : p1(arg) {}
};

int main()
{
auto f = first::create();
}

编辑:Unconstructable 的使用并不是真正必要的,但对于 std::make_unique 的使用是必需的。如果我简单地将构造函数设为私有(private),那么即使我将其设为 friend 函数,std::make_unique 也将无法编译,因为实现使用了内部辅助函数。将私有(private) struct 作为构造函数参数是一种绕过它的方法,同时仍然可以防止在类本身之外进行构造。

关于c++ - 指针共享习语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34023368/

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