C++:在不是所有派生类都预先已知的情况下使用继承

C++: Using inheritance when not all of the derived classes are known up front?

本文关键字:情况下 继承 派生 C++      更新时间:2023-10-16

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

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

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

我可以用一串IF/"ELSE"语句来完成这项工作,将用户输入与一堆预先确定的文件代码进行比较,但我希望将来能够添加对新文件类型的支持,而无需编辑一串if语句和添加新文件代码等。

有没有任何方法可以在运行时访问基类的所有派生类的编译器生成的表?

或者可能是某种多态构造函数,它是根据传递的参数的值动态绑定的?

(例如InputFile(string)TXTInputFile(string temp = "TXT")ASCInputFile(string temp = ASC")…我意识到这是参数默认值的格式,只是试图暗示我的思路。)

提前谢谢。

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

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