如何使用C 中的共享/弱指针清洁实现两个对象
How to cleanly implement two objects referring to eachother using shared/weak pointers in c++?
假设我有一个类:
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
的所有权层次结构如何无效而无需修改。
相关文章:
- 如何实现自定义匹配器以检查 Catch2 中的对象相等性
- 我能否通过将函数实现为类对象方法来避免使用互斥锁
- 为什么地图需要实现'operator<'以及如何比较对象?
- CMake + Qt,moc 编译失败,无法实现 QMetaObject 方法(编译器找不到基本 ui 对象的标头?
- C++接口实现和子类化对象识别
- 对象内部有大量数据容器,实现更高效的对象交换
- 使用初始值设定项列表作为函数参数的类对象实现运算符 [] 的示例
- 可选<double>可以作为 8 字节对象实现吗?
- 我们可以在同一对象中实现多个QtRO接口吗?
- C++实现相同接口的对象/类之间的数据共享
- 实现附加对象:不清楚的文档示例
- 从另一个类实现对象
- C 将功能实现对象作为接口类型
- 实现对象列表时,如何处理动态分配
- 如何实现对象指针的动态数组? "expression must be a modifiable lvalue"
- 在C++中实现对象向量的访问者模式
- 如何正确实现对象列表的创建(和分配)仅由C++中的抽象基知道
- 我们应该如何实现对象类型的移动
- 在现代c++中实现对象流容器的最佳实践
- 实现对象跟踪,如在 Boost::Serialization 中