C++ 创建一个C++;从textfile/XML文件初始化

C++ 创建一个C++;从textfile/XML文件初始化,c++,class,parsing,struct,text-files,C++,Class,Parsing,Struct,Text Files,我基本上想要为我想要创建的一些数据类型创建一个内部结构。这些数据类型将保存程序中的大部分信息(基本上是一个大型数据库,但我希望避免设置一个数据库以供使用的麻烦),并且将被序列化/非序列化 但是我想从文本文件/ml文件的布局动态创建这些类/结构。例如: container Music field string name field largenumber filesize end container 这是一个非常基本的例子:在上面,“容器”将是数据类型(类或结构),“字段”表示变量(字符串是…S

我基本上想要为我想要创建的一些数据类型创建一个内部结构。这些数据类型将保存程序中的大部分信息(基本上是一个大型数据库,但我希望避免设置一个数据库以供使用的麻烦),并且将被序列化/非序列化

但是我想从文本文件/ml文件的布局动态创建这些类/结构。例如:

container Music
field string name
field largenumber filesize
end container

这是一个非常基本的例子:在上面,“容器”将是数据类型(类或结构),“字段”表示变量(字符串是…STL字符串,大数是无符号整数或SOMESUCH)。是的,我意识到我想要像C++分析器(对于编译器)检查正确语法的东西。 我基本上希望我的程序的用户创建他们自己的数据类型(添加一个字段/删除一个字段/创建他们自己的结构),然后将其永久保留在我的程序中

(我已经解决了如何在执行此操作时序列化/取消序列化-我所要做的就是确保还使用序列化数据保存上次创建的类/结构文本文件,以便在取消序列化时重新创建数据类型)

有谁知道如何着手做这件事,或者建议更好地实现我的设计


另外,显然这些信息需要在运行时而不是编译时创建。

对于XML到对象的转换,您实际上看到的是SOAP的一部分。我更喜欢RapidXML,但您可以尝试其他XML解析器来创建/读取对象

对于文本文件,您可能需要编写自己的解析器来正确处理文本文件,并期望正确的类型和定义,然后相应地生成对象

我同意,除非存在公共接口,否则动态创建一个对象并用值填充它并不简单


作为旁注,既然你说你希望你的用户动态地“创建”类型,为什么不像你建议的那样研究一种简单的脚本语言(或者自己做一个DSL?

,我会通过编写一个XML解析器来做到这一点,数据类型定义将在文件中。这样,解析变得非常简单(使用任何XML读取库)。您在运行时创建数据类型,所需的只是:一个类容器和一个类字段,您可以在其中存储名称、类型等

预处理XML文件,生成一个函数,用于填充您的某些数据结构,通常如下所示:

Field newfield1 (name, type, whatever);
Field newfield2 (name2, type2, whatever2);
...
Container newContainer;
newContainer.addField(newfield1);
newContainer.addField(newfield2);
...
当然,您可以更好地组织您的代码,但这只是给出一个想法。首先将您的数据类型写为XML,预处理您的XML并生成“run-time”.cpp文件来创建您的动态类型,您可以将其包含在项目中,然后您可以根据需要使用您的类型


要创建不同类型的字段(事先不知道),可以使用boost::variant(也可以从XML生成类型列表)。您甚至可以为每个字段生成一个typedef,以确保在以后使用boost:get时使用正确的类型。

您是否可以更清楚一些?例如,您是否无法将这些数据作为一个类来查看?也就是说,您是否可以编写一个可以包含可变数量的可变类型元素的类?或者在这之后,您是否遇到了序列化i的问题你是否总有一个更好的解决方案?你的P.S.在一个运行时,你怎么编译C++代码?你不能在运行时在C++程序中创建新的类型。你需要为你的用户创建一个语言来表达他们的类型(或者重用现有的语言)。这个语言不需要类似于C++。这里有两个不同的问题,(1)使用什么语言,(2)如何实现它。不,使它三。(3)当你说“然后永久地保存在我的程序中”时,你不需要DBMS吗?我假设你的意思是定义方面的,而不是生成可编译的代码并将其放入地址空间但是在C++中,我认为字典和一个合适的变体数据类型是最基本的,你可以做的。作为一个澄清,比如说你有一个漂亮的图形界面,它有行和列。每行都代表一个完整的“入口”,每个列都是一个“变量”。整个页面将是你的数据库中的一个表。添加另一列(数据结构中的新变量)的步骤。您还希望在程序关闭时将该列保留在输出的数据中。DBMS会更易于使用吗?太好了!是的,这听起来正是我想要做的-这个概念看起来也像编译器解析信息的方式。非常感谢!读了一些书后,我找到了boost::any类-我可能有一个boost::任意变量的映射,是吗?只要用户指定了数据类型(在一系列预定义类型中),从文件中读取XML格式的数据并将其转换为正确的类型将非常容易。我不确定与此方法相比,使用variant将如何工作。您能解释一下吗?是的,当然,boost::any也会工作,这取决于您如何使用它。我更喜欢boost::variant,因为它提供静态检查而不是运行时检查,但它是一个m不同的口味。看看这个页面,决定什么最适合你。请注意,如果你觉得合适的话,可以关闭这个帖子。啊哈,我的意思是:点击我帖子旁边的“勾号”,这样这个帖子就可以标记为“已解决”。如果上面的选项不起作用,我会研究这个问题。谢谢你的回复!