gpt4 book ai didi

c++ - 如何在 C++ 中使用共享/弱指针干净地实现两个引用彼此的对象?

转载 作者:行者123 更新时间:2023-11-28 02:05:01 25 4
gpt4 key购买 nike

假设我有一个类:

class Entity {
vector<weak_ptr<Entity> > aboveMe;
vector<weak_ptr<Entity> > belowMe;

void addBelow(weak_ptr<Entity> below)
{
belowMe.push_back(below);
}

void addAbove(weak_ptr<Entity> above)
{
aboveMe.push_back(below);
}
}

这必须始终为真:

If an Entity A is above an Entity B, B is below A and vice versa.

什么是最优雅的表示方式?

目前,客户端代码可以简单地调用:

a->addBelow(b).

但是,没有相应的调用

b->addAbove(a)

不变量被违反了!

在 Java 中,人们会做这样的事情:

void addBelow(Entity below)
{
belowMe.add(below);
below.addAbove(this); // With obviously some mechanism to prevent infinite recursion
}

使用共享/弱指针时,在 C++ 中执行此操作的最佳方法是什么?

最佳答案

您当然可以在 C++ 中使用类似的方法。如果一个对象被设计成由共享指针管理其生命周期,它可以从模板类 std::enable_shared_from_this 继承,如下所示:

class Entity : public std::enable_shared_from_this<Entity> { ...

然后您可以从 this 指针安全地创建共享指针。然后方法:

void addBelow(weak_ptr<Entity> below)
{
belowMe.push_back(below);
below.addAbove(shared_from_this());
}

将接近您的需要。

这里需要指出的一点是:就目前而言,您的链中的对象之间没有所有权关系,因此只要对象是从外部“拥有”的,这就可以工作。

如果您想允许所有权层次结构,您可以另外更改您的链,以便对象“向下拥有”:

vector<weak_ptr<Entity> > aboveMe;
vector<shared_ptr<Entity> > belowMe;

注意:您当然不希望双向共享指针,因为那样您将拥有循环所有权,从而永远不会释放对象。

注意 2:shared_ptr 类可以从 weak_ptr 引用构造,反之亦然。因此,无论您选择哪种所有权层次结构,上面的 addBelow 建议都可以不加修改地工作。

关于c++ - 如何在 C++ 中使用共享/弱指针干净地实现两个引用彼此的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37857459/

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