我目前正在使用 C++ 开发游戏。由于没有垃圾收集器,因此必须始终小心地删除对象,并确保这些对象一旦被删除就不再被访问。
现在随着项目的发展,一些对象可能会被越来越多的地方引用。例如,我在游戏中的单位可能会从渲染器、场景层次结构、选择机制、HUD 等中引用。现在 - 如果一个对象被删除,必须确保所有其他引用该对象的类都将收到通知。
或者让我们反过来说 - 如果我创建一个可能引用我的一个单元的新类,我还必须更改单元的代码(或单元管理器的代码或任何模块删除单元,如果它得到销毁)以确保这个新模块知道它当前引用的特定单元何时被删除。
现在我认为可以有一种简单的事件驱动的通用方法来解决这个问题,方法是创建一个基类,另一个对象可以订阅该基类。像这样的东西:
class DeletableBase;//forward declaration
class ISubscriber{
public:
virtual someObjectGotDeleted(DeletableBase* deletedObject)=0;
};
class DeletableBase{
private:
vector<ISubscriber*> subscribers;
public:
virtual ~DeletableBase(){
for(int i=0; i<subscribers.size(); i++)
subscribers[i]->someObjectGotDeleted(this);
}
subscribeForDeleteEvent(ISubscriber* subscriber){
subscribers.push_back(subscriber);
}
};
有了这个 - 如果我从一个新类引用从这个类继承的任何对象,我可以简单地将自己添加为订阅者,如果该对象将从任何其他地方删除,我将收到有关它的通知。
这是一种“干净”的编码方式吗?