我对递归非常不好,以前从未使用它。我知道它的理论..不是那有帮助:))对于我的问题,我有一个TCollection的结构,包含TCollection和TCollectionItem等。我必须编写一个递归函数,将读取我所有的TCollectionItems。 这是图形视图:
TCollection-> TCollectionItem(S) - > TCollection-> TCollectionItem(S)
TCollection在他之下可以有1个甚至2,3个TCollection,或者没有。
以下是几个例子:
TCollection-> TCollectionItem
TCollection-> TCollectionItem-> TCollection-> TCollectionItem-> TCollection-> TCollectionItem
等..
请告诉我,如果我严重描述了这个问题,我可能会这样做..请问是否有不清楚的地方:)
感谢您的支持!
答案 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
的子TRttiProperty
和tkClass
项,然后使用TRttiField::GetValue()
和TRttiProperty::GetValue()
方法获取TObject
对象可以使用TCollection
类型转换为dynamic_cast
指针的指针。