递归读取TCollection

时间:2010-10-21 08:51:18

标签: c++ recursion tcollection tcollectionitem

我对递归非常不好,以前从未使用它。我知道它的理论..不是那有帮助:))对于我的问题,我有一个TCollection的结构,包含TCollection和TCollectionItem等。我必须编写一个递归函数,将读取我所有的TCollectionItems。 这是图形视图:

TCollection-> TCollectionItem(S) - > TCollection-> TCollectionItem(S)

TCollection在他之下可以有1个甚至2,3个TCollection,或者没有。

以下是几个例子:

TCollection-> TCollectionItem

TCollection-> TCollectionItem-> TCollection-> TCollectionItem-> TCollection-> TCollectionItem

等..

请告诉我,如果我严重描述了这个问题,我可能会这样做..请问是否有不清楚的地方:)

感谢您的支持!

2 个答案:

答案 0 :(得分:1)

您尚未指出TCollection方法的原型,以便枚举和读取您的TCollectionItems以及其他所需的详细信息。

但是,这绝对可以解决:The Composite Design Pattern

此模式的目的是遍历递归形式,并将复合体上的调用转发到其合成器上,依此类推,直到到达叶子(TCollectionItems在您的情况下为空TCollection)

答案 1 :(得分:1)

递归访问子TCollection对象的唯一方法是在不知道拥有TCollectionItem对象的类类型的情况下进行类型转换,这是使用VCL的RTTI信息。

在XE之前的C ++ Builder版本中,基于VCL的RTTI仅适用于__published属性。给定TCollectionItem(或任何常规TObject)对象指针,您可以使用GetPropList()中声明的TypInfo.hpp函数来检索该对象的已发布属性信息的列表。然后,您可以遍历该列表,检查报告TypeKind值为tkClass的任何属性。当您找到一个时,使用GetObjectProp()函数来检索该属性的TObject指针值,然后使用dynamic_cast确保它在访问其之前确实是TCollection对象子TCollectionItem个对象。

在C ++ Builder 2010中,引入了一个新的增强型RTTI系统,在Rtti.hpp中声明,它为类的所有成员提供信息,包括未发布的属性和字段。通过这个加强的RTTI,不再需要将子TCollection声明为__published属性。在此系统下,您将使用TRttiContext类访问递归的TRttiType对象的TCollectionItem对象,然后使用TRttiType::GetFields()TRttiType::GetProperties()方法查找报告TypeKind为TRttiField的子TRttiPropertytkClass项,然后使用TRttiField::GetValue()TRttiProperty::GetValue()方法获取TObject对象可以使用TCollection类型转换为dynamic_cast指针的指针。