这是一个可通过的软件设计?

Mat*_*Mat 5 c++ software-design

我目前正在用c ++开发游戏.因为没有垃圾收集器,所以总是要小心地删除对象,并确保一旦删除这些对象就不再被访问了.
现在随着项目的发展,一些对象可能会被越来越多的地方引用.例如,游戏中的我的单元可以从渲染器,场景层次结构,选择机制,HUD等引用.now - 如果一个对象被删除,则必须确保引用该对象的所有其他类都将被通知.
或者让我们说另一种方式 - 如果我创建一个可以引用我的单位的新类,我还必须更改单元的代码(或单元管理器或任何模块删除单元的代码,如果它得到为了确保这个新模块知道它当前引用的特定单元何时被删除.

现在我认为可以有一个简单的事件驱动的通用方法,通过创建另一个对象可以订阅的基类来解决这个问题.像这样的东西:

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);
    }
};
Run Code Online (Sandbox Code Playgroud)

有了 - 如果我从一个新类引用从这个类继承的任何对象,我可以简单地将自己添加为订阅者,如果该对象将从任何其他地方删除,我会得到关于它的通知.

这是一种"干净"的编码方式吗?

Fre*_*Foo 6

如果这纯粹是关于内存管理(而不是状态更改),请改用智能指针.从开始shared_ptr,然后优化使用make_shared/ allocate_sharedboost::intrusive_ptr如果它太慢.