gpt4 book ai didi

c++ - 单例替代

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

我有一个非常简单的游戏引擎。它使用了几个单例(我将列举其中的一些)。

Resource Manager
Render Engine
Events Manager
Factory
etc

这些单例之间有很多调用。我将采用事件管理器示例用法:

  1. 任何派生自 Listener 的对象都可以将自己添加为某些事件的监听器,就像这样 EventsManager->RegisterListener(this, &SomeClass::SomeMethod); (事件类型由 SomeMethod 参数推断)
  2. 任何其他对象都可以触发这样的事件 EventsManager->PushEvent(SomeEvent);

经过一些同步后,事件到达所有监听器。当 EventsManager 是单例时,这是一个非常简单的用法。

其他单例的行为类似。我想删除单例,但我的主要问题是我想从“用户的角度”保持代码易于使用,就像现在一样。我阅读了一些这样做的技术,但大多数使类的初始化/使用更加复杂。我知道这个话题在 SO 上被讨论过很多次,但是没有一个答案适合我的编程哲学——让一切尽可能简单。

我不想对我的类进行复杂的定义/初始化,例如:

SomeClass<EventManager, RenderEngine,...>

SomeClass::SomeClass(EventsManager, RenderEngine...)

你能给我一些关于这个话题的建议吗?

最佳答案

你可以有一个全局的“游戏”对象,它为当前是单例的每个类创建一个实例

对于你的EventManager的具体例子;您的 Listener 基类可以提供派生类可以调用的 register 方法和 push 方法的实现。

骨架定义:

class Listener
{
public:
virtual void ReceiveMessage( ... ) = 0;

protected:
void Register()
{
GetEventManagerSomehow()->RegisterListener( this, etc );
}

void PushEvent( etc )
{
GetEventManagerSomehow()->PushEvent( etc );
}

}

关于c++ - 单例替代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13628889/

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