1

可能重复:
有没有办法从保存类名的字符串中实例化对象?

我正在处理一些 C++ 代码中的一个问题,该代码具有一个基类InputFile和许多派生类:TxtInputFileASCInputFile等,其中每个派生类都是特定的输入类型。

我想做的是从命令行中取出一个变量,然后生成正确的派生类对象来处理指示的文件类型(例如,用户TXT在命令行中指示,所以,我生成一个TXTInputFile对象并在InputFile标签下返回以用于程序的其余部分)。

我可以用IF/ 'ELSE' 语句的字符串来做到这一点,将用户输入与一堆预定的文件代码进行比较,但我希望将来能够添加对新文件类型的支持而无需编辑字符串if 语句和添加新的文件代码等。

有什么方法可以在运行时访问某个编译器生成的所有派生类表到基类?

或者可能是某种基于传递参数等于动态绑定的多态构造函数?

(例如InputFile(string)...... TXTInputFile(string temp = "TXT")ASCInputFile(string temp = ASC")......我意识到这是参数默认值的格式,只是想建议我用这种思路去哪里。)

提前致谢。

4

2 回答 2

5

您可以进行std::map从字符串到工厂函数的映射(可能使用 )。

于 2012-10-01T02:56:00.960 回答
0

如果解析非常复杂,请不要滚动您自己的解析器。有很多选择,从旧的备用 lex/yacc(或 flex/bison)到 Boost::Spirit 到 ANTLR。Lex/yacc 是一个 LALR 解析器,它生成代码。生成的代码有点难以理解和调试。Boost::Spirit 更符合现代编程概念,ANTLR 也是如此。基本思想是您指定语法以及如何处理该语法。

于 2012-10-01T03:00:19.217 回答