从文本文件/XML文件创建C++类
Creating a C++ Class from a textfile/XML file
我基本上想为我想要创建的一些数据类型创建一个内部结构。这些数据类型将保存我的程序中的大部分信息(基本上是一个大型数据库,但我想避免设置使用数据库的麻烦),并且将被序列化/未序列化。
但我想从文本文件/ml文件的布局中动态创建这些类/结构。例如:
container Music
field string name
field largenumber filesize
end container
这是一个非常基本的例子:在上面的例子中,"container"将是数据类型(类或结构),"field"表示一个变量(字符串是..一个stl字符串,一个大数字是一个无符号整数或类似的东西。是的,我意识到我想要一个类似C++解析器的东西(对于编译器来说)来检查正确的语法。
我基本上希望我的程序的用户创建他们自己的数据类型(添加字段/删除字段/创建自己的结构),然后将其永久保存在我的程序中。
(我已经想好了如何在执行此操作时序列化/取消序列化-我所要做的就是确保我还将上次创建的类/结构文本文件与序列化的数据一起保存,这样我就可以在取消序列化时重新创建数据类型)。
有人知道如何做这件事吗,或者建议更好地实现我的设计吗?
附言:显然,这些信息需要在运行时创建,而不是在编译时创建。
对于XML到对象的转换,您实际看到的是SOAP的一部分。我更喜欢RapidXML,但您可以尝试其他XML解析器来创建/读取您的对象。
对于文本文件,您可能需要编写自己的解析器来正确处理文本文件,期望正确的类型和定义,然后相应地生成对象。
我同意,除非存在公共接口,否则动态创建一个对象并用值填充它并不是一件小事。
顺便说一句,既然你说你希望你的用户动态地"创建"类型,为什么不研究一种简单的脚本语言(或者自己制作DSL?)
正如您所建议的,我将通过编写一个XML解析器来实现这一点,并且数据类型定义将在文件中。通过这种方式,解析变得非常容易(使用任何XML读取库)。您在运行时创建数据类型,所需的只是:一个类Container和一个类Field,您可以在其中存储名称、类型等。
您预处理XML文件,生成一个函数来填充您的一些数据结构,通常看起来像:
Field newfield1 (name, type, whatever);
Field newfield2 (name2, type2, whatever2);
...
Container newContainer;
newContainer.addField(newfield1);
newContainer.addField(newfield2);
...
当然,您可以更好地组织代码,但这只是为了给出想法。首先将数据类型写为XML,预处理XML并生成"运行时".cpp文件来创建动态类型,将其包含在项目中,然后可以根据需要使用类型。
要创建不同类型的字段(事先不知道),可以使用boost::variant(也可以从XML生成类型列表)。您甚至可以为每个字段生成一个typedef,以确保以后使用boost:get<>时使用正确的类型。
- 终端不会为C++文件创建.exe文件吗
- 如何从具有两列的.txt文件创建并行数组?
- 从 .lib 文件创建一个.dll文件
- 如何从输入文件 c++ 创建随机名称生成器
- 无法从 cso 文件创建顶点着色器(从 fx 文件创建)
- 如何为多个目录中的多个文件创建生成文件?
- 在编译时从 c++ 文件创建枚举
- 如何在运行时从 c++ 中的 DLL 文件创建对象?
- 文件创建并不总是成功
- 如何使用 QFile、c++ 从文件创建整数数组
- 您可以使用 makefile 从 .o 对象文件创建 C++ 文件吗?
- 从函数中的dat文件创建一个2维数组
- 如何为 cpp 和 h 文件创建别名(并忽略编译器__attributes__)
- 如何从现有的生成文件创建 CMake 文件?
- 为什么我无法使用文本文件创建文件映射?
- 通过读取文件创建映射<字符串,矢量>时如何管理内存<string>
- 从文本文件创建 2D 字符串矢量
- ofStream: - 尽管文件创建了,但文本文件上没有输出
- 从语言文件创建JSON对象
- 将文本文件创建到节点.js的插件C++