6

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

在此处输入图像描述

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

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

EntityCharacter -> EntityVehicleSeat
EntityCharacter <- EntityVehicleSeat

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

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

在此处输入图像描述

怎样才能巧妙地表达这种所有权?如何通知另一个对象另一个对象不再存在的事实?

4

1 回答 1

4

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

~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;
    }
}

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

于 2013-03-31T10:10:23.810 回答