C++ 从基指针集合转换为子类
我需要建模一个服务检索器类来检索各种服务 假设您有一个服务集合,每个服务都可以使用唯一的字符串键检索 (例如:C++ 从基指针集合转换为子类,c++,inheritance,design-patterns,casting,C++,Inheritance,Design Patterns,Casting,我需要建模一个服务检索器类来检索各种服务 假设您有一个服务集合,每个服务都可以使用唯一的字符串键检索 (例如:Services.getService(“render”);应检索索引为“render”的服务)。 现在,Service是各种*服务继承类的基类,如RenderService、InputService等,每个类都有不同的方法 现在,可以使用std::unordered_map对其进行简单建模,但它返回一个指向基类而不是派生类的指针(到目前为止,这是非常明显的)。这意味着如果不执行显式强制
Services.getService(“render”);
应检索索引为“render”的服务)。
现在,Service
是各种*服务继承类的基类,如RenderService、InputService等,每个类都有不同的方法
现在,可以使用std::unordered_map
对其进行简单建模,但它返回一个指向基类而不是派生类的指针(到目前为止,这是非常明显的)。这意味着如果不执行显式强制转换,就无法自动调用请求的服务的方法,我必须编写如下内容:((RenderService*)Services.at(“render”)->callrenderservice()方法代码>。
这是非常丑陋和冗余的,因为at
方法键在逻辑上链接到RenderService
我可以通过声明来回避这个问题:
#定义调用呈现((RenderService*)服务。在(“呈现”)
并将其用作
CALL_RENDER->callRenderServiceMethod()代码>
虽然它看起来像一个聪明的“黑客”,但它不是解决这个问题的正确方法
我还尝试了一些类似于getService(“render”)代码>但它工作不好,冗余问题仍然存在
最后,我这么做是因为我想避免这样:
班级服务
{
公众:
RenderService&getRenderService();
AudioService&getAudioService();
AnotherInheritedService&getAnotherInheritedService();
私人:
RenderService_RenderService;
音频服务(AudioService);;
AnotherInheritedService\u AnotherInheritedService;
};
对于这类问题,我应该使用哪种方法?根据我对问题的理解,您需要将函数声明为
在基类定义中声明虚函数并在每个派生类中实现该函数将允许根据类指针的类型调用相应类的函数
现在,我不明白为什么只有指向基类的指针。从逻辑上讲,从unordered\u map
返回的指针实际上应该是派生类指针,但只能“上溯”到基类指针。我不确定这是否是您“应该”使用的方法,但可以做的一件事是使用模板方法,使用GetService(void)方法,它在内部使用一个开关来返回适当的实例。我认为在这种情况下不应该使用虚拟函数,因为继承的服务类之间没有公共接口。另外,我有指向基类的指针,因为我想使服务类尽可能可扩展(例如:如果我想插入新服务,我应该在unordered_map
集合中放置一个新服务,并按名称命名)。