2012-11-28 96 views
0

我基本上想为我想创建的某些数据类型创建一个内部结构。这些数据类型将保存我的程序中的大部分信息(基本上是一个大型数据库,但我想避免设置一个可用的麻烦),并且将被序列化/非序列化。从文本文件/ XML文件创建一个C++类

但我想从文本文件/ ml文件的布局中即时创建这些类/结构。例如:

container Music 
field string name 
field largenumber filesize 
end container 

这是一个非常基本的例子:在上述中,“容器”将是数据类型(类或结构),“字段”表示变量(以字符为..一个STL串,并且大部分是一个无符号整数或者其他的东西。是的,我意识到我想要类似于C++解析器(如编译器)的东西来检查正确的语法。数据类型(添加一个字段/删除一个字段/创建自己的结构),然后将其永久保存在我的程序中。这样做时序列化/反序列化 - 我所要做的就是确保我还保存了最后创建的具有序列化数据的类/结构文本文件,以便在反序列化时可以重新创建数据类型)。

有人会知道如何去做这件事,或建议我的设计更好的实现?

P.S.很明显,这些信息需要在运行时创建,而不是编译时。

+1

你能更清楚吗?例如,您是否在查看这些数据时遇到问题?也就是说,你可以写一个可以包含可变数量的变量类型元素的类吗?或者之后你的问题是序列化呢?或者你通常会问是否有更好的解决方案? – Shahbaz

+0

Your P.S.一点也不明显。如何在运行时编译生成的C++代码? – Cameron

+0

您不能在运行时在C++程序中创建新类型。您需要为您的用户创建一种语言以表达其类型(或重用现有语言),并在您的程序中实施它。这种语言不需要类似于C++。这里有两个不同的问题,(1)使用什么样的语言,以及(2)如何实现它。不,让它三个。 (3)你真的不需要DBMS吗? –

回答

1

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

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

我同意,动态创建一个对象并用值填充它并不是微不足道的,除非存在一个通用接口。

作为一个侧面说明,既然你说你希望你的用户“创造”型动态,为什么不考虑一个简单的脚本语言(或让自己DSL?)

+0

如果上述选项不起作用,我会研究这一点。感谢yoru回复! – user1853098

1

按照你的建议,我会通过编写XML解析器来完成该操作,并且数据类型定义将位于该文件中。这样,解析变得非常简单(使用任何XML读取库)。在运行时创建的数据类型,你需要的是:一类集装箱和一类,您可以存储名称,类型等

您预处理您的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 <>。

+0

非常好!是的,这听起来像我想做的事情 - 这个概念看起来也像编译器解析信息的方式。非常感谢! – user1853098

+0

做了一些阅读之后,我发现了boost :: any类 - 可能我可以使用boost :: any变量的映射,是的?只要用户指定了数据类型是什么(在一系列预定义类型之外),就可以很容易地将数据作为XML从文件中读出并将其转换为正确的类型。 我不确定如何使用variant与此方法相比起作用。你能解释一下吗? – user1853098

+0

是的,boost :: any也可以,取决于你如何使用它。我更喜欢boost :: variant,因为它提供静态检查而不是运行时检查,但这是一个品味问题。 看看这个页面[Boost比较页面](http://www.boost.org/doc/libs/1_52_0/doc/html/variant/misc.html)来决定什么最适合你。 – Mic