在构建模拟器应用程序时,我希望能够将当前正在处理的模拟保存/加载到文本文件中。我有一个文本文件标准,实际上是一个csv,其中每行对应于模拟的组成部分,每行的第一项是唯一标识给定组件的字符串。我希望能够解析此文本文件,并根据该第一个条目来动态创建具有相应组件类型的对象。
所有组件都在自己的类中定义,这些类从Base
类扩展。解析的结果应为我提供Base
指针的列表,这些指针是从文本文件解析的各个组件的多态指针。解决此问题的最明显方法是在组件的解析类型上使用一个巨大的if-else:
Base* p;
if(type == "A"){
p = new A();
} else if(type == "B"){
p = new B();
} ...
但是,这非常繁琐。因此,我的下一个解决方案是创建一个映射,以便条目的键是唯一的标识符字符串,而值是指向该函数的函数指针,该函数返回一个多态指针,该指针指向相应组件的新实例。这样,我可以从文本文件中解析出type
字符串,并运行如下代码:
Base* p = functionMap.at(type)();
地图中每个函数的定义如下:
//Note that this doesn't need to be scoped off of each class, I've only
//done this to make it clear that this function could be an overridden
//function from the base class in the children if that brings a solution
Base* A::generate(){
return new A();
}
这一切都很好,但是我无法在没有做任何其他事情之前,将generate
函数的每个insert
函数添加到映射中,除非isEven
将main中的每个函数都添加了。在这一点上,我仍然会为每个组件进行硬编码,我也可能只使用if-else。
我可以在每个标头中定义generate函数(尽管它们都相同,并且实际上只是将硬编码抽象为多个文件而不是一个文件)是可以的,只要我可以自动将类注册到映射中即可。
是否可以使用功能指针映射解决方案?或者,是否有一种方法可以在解析器中实现不涉及对每个组件进行硬编码的行为?到目前为止,该软件的其余部分都适用于自动定义的任何新组件,因此,不必在每次创建新组件时都手动添加组件,真是太好了。