我需要为服务检索器类建模以检索各种服务。
假设您有一组服务,每个服务都可以使用唯一的字符串键检索
(例如:Services.getService("render");
应该检索索引为“ render”的服务)。
现在,Service
是各种* Service继承的类的基类,例如RenderService,InputService等。 ,每种方法各不相同。
现在,可以使用std::unordered_map<std::string, Service*>
对其进行简单建模,但是它返回指向基类而不是派生类的指针(到目前为止,这很明显)。这意味着如果不执行显式强制转换,就无法自动调用请求的服务的方法,我必须编写如下内容:((RenderService*)Services.at("render"))->callRenderServiceMethod();
。
这非常丑陋和多余,因为at
方法键在逻辑上链接到RenderService
。
我可以声明以下内容来解决这个问题:#define CALL_RENDER ((RenderService*)Services.at("render"))
并将其用作CALL_RENDER->callRenderServiceMethod();
尽管它看起来像是一个聪明的“ hack”,但这不是解决此问题的正确方法。
我也尝试做类似getService<RenderService>("render");
的操作,但是它不能很好地工作,并且冗余问题仍然存在。
最后,我这样做是因为我想避免这种情况:class Services{ public: RenderService& getRenderService(); AudioService& getAudioService(); AnotherInheritedService& getAnotherInheritedService(); private: RenderService _renderService; AudioService _audioService; AnotherInheritedService _anotherInheritedService;};
对于这种问题,我应该使用哪种方法?
最佳答案
根据我对问题的了解,您需要将这些函数声明为virtual functions。
在基类定义中声明一个虚函数并在每个派生类中实现该函数将允许根据类指针的类型来调用适当的类的函数。
现在,我不明白为什么您只具有指向基类的指针。从逻辑上讲,从unordered_map
获取的指针实际上应该是派生的类指针,但只能“转换”为基类指针。
关于c++ - 从基本指针的集合转换为子类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26653214/