【问题标题】:C++ - Representing ownership via pointersC++ - 通过指针表示所有权
【发布时间】:2013-03-21 15:13:04
【问题描述】:

在我的游戏引擎中,共有三个类:EntityCharacterEntityVehicleEntityVehicleSeat

EntityVehicle 包含带有指向 EntityCharacter 实例的指针的座位对象。如果座位对象的目标字符实体指针是空指针,则没有字符坐在该特定座位对象上。 EntityCharacter 类实例也有指向座位对象的指针,指示这些角色实体是否坐在某些车辆中。

换句话说,EntityCharacter 类实例有一个指向 EntityVehicleSeat 的指针,反之亦然:

EntityCharacter -> EntityVehicleSeat
EntityCharacter <- EntityVehicleSeat

这样我们可以通过角色和车辆实体来检查所有权。

将指针设置为相互指向很简单,但有一个问题 - 如果另一个对象超出范围,我们最终会在剩余对象中拥有一个无效的指针。

如何巧妙地表达这种所有权?如何通知另一个对象另一个对象不再存在?

【问题讨论】:

  • 在析构函数上使用通知。
  • 你能用析构函数通知其他对象吗?
  • 这只是一对一的关系吗?

标签: c++ pointers ownership nullptr


【解决方案1】:

管理对象到对象的关系,包括双向关系,是析构函数变得有用的地方。您可以像这样消除悬空指针的问题:

~EntityCharacter() {
    // Do some other cleanup...
    ...
    if (seatPtr) {
        assert(seatPtr->characterPtr == this); // That's my seat!
        seatPtr->characterPtr = NULL;
    }
}

~ EntityVehicleSeat() {
    // Do some other cleanup...
    ...
    if (characterPtr) {
        assert(characterPtr->seatPtr == this); // That's my character!
        characterPtr->seatPtr = NULL;
    }
}

这种方法的一个问题是并发性:如果一个座位和一个角色可以同时从不同的线程中删除,则需要同步删除。

【讨论】:

  • 如此简单又如此得心应手。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-28
  • 1970-01-01
  • 2014-09-25
相关资源
最近更新 更多