2012-11-28 97 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