gpt4 book ai didi

c++ - 这是一个合格的软件设计吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:22:14 25 4
gpt4 key购买 nike

我目前正在使用 C++ 开发一款游戏。由于没有垃圾收集器,因此必须始终小心地删除对象,并确保这些对象一旦被删除就不会再被访问。
现在随着项目的增长,一些对象可能会从越来越多的地方被引用。例如,我在游戏中的单位可能会从渲染器、场景层次结构、选择机制、HUD 等中引用。现在 - 如果一个对象被删除,必须确保所有其他引用该对象的类都将收到通知。
或者让我们换个说法——如果我创建一个可能引用我的一个单元的新类,我还必须更改单元的代码(或单元管理器的代码或任何删除单元的模块,如果它得到destroyed) 以确保这个新模块知道它当前引用的特定单元何时被删除。

现在我认为可能有一个简单的事件驱动的通用方法来解决这个问题,方法是创建一个其他对象可以订阅的基类。像这样:

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

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

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

最佳答案

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

关于c++ - 这是一个合格的软件设计吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4875792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com