2010-09-14 41 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定义。