2010-09-14 44 views
1

對不起,提前對於冗長的解釋!C++中的信息樹的設計問題

我有一個C++應用程序,它使用hash_map來存儲從文本文件解析的信息樹。地圖中的值是孩子hash_mapstring。這些值是從文本文件中解析出來的,然後存儲到地圖中。

我想避免必須將字符串和映射作爲副本發送到哈希映射分配函數,因此在解析文件時,我創建了一個指向new string()new hash_map()的指針,並將該值存儲爲映射爲「任意「數據(指向void的數據)。

但是,當涉及到清理時,這會帶來相當大的問題,因爲刪除一個void並不像一個人想要的那樣工作(這是有道理的)。我尋找一個簡單的解決方案,只需創建一個Object類,並創建子類StringObjHashMap,它們存儲其各自的數據,並調用適當的析構函數,因爲hash_map值類型已更改爲指向Object的指針。

有沒有更簡單的方法來解決這個問題?我研究了動態投射,並認爲它可能運作良好,因爲我可以從失敗的投射中捕捉異常,並適當地對待它,但我不禁感到可能有更簡單的解決方案,使它複雜一點。

對此提出建議?

由於提前, Jengerer

+0

你在使用hash_maps中的鍵嗎?它們對樹還是每個地圖都是唯一的? – sje397 2010-09-14 04:50:43

回答

3

使用boost :: variant(這相當於用戶定義類型的C++聯合),C++ union(適用於本例,因爲您只處理指針)或boost :: any(可以存儲任何類型)存儲指向hash_map或string的指針。

+1

對於'Boost.Variant'爲+1,這是無關類型的最佳解決方案。 – 2010-09-14 06:44:56

0

另外一個選擇是,你可以存儲std::pair<hash_map*, string*>在哈希表中的每個條目。顯然,將每對中未使用的指針設置爲NULL,以便您可以分辨哪個被使用,哪個不是。

,尚無定論,這比你的方法整潔與否,雖然我會大膽地說,這是較少的代碼,因爲你不需要的ObjectStringObjHashMap定義。