我很不擅长递归,以前从未用过它。我知道它的原理..这没什么帮助:))对于我的问题,我有一个包含TCollection和TCollectionItem等的TCollection结构。我必须编写一个递归函数来读取我所有的TCollectionItems。这是图形化视图:
TCollection->TCollectionItem(s)->TCollection->TCollectionItem(s)
TCollection下可以有1个甚至2,3个T集合,或者一个都没有。
下面是更多的例子:
TCollection->TCollectionItem
TCollection->TCollectionItem->TCollection->TCollectionItem->TCollection->TCollectionItem
等等。
如果我描述的问题不好,请告诉我,我可能是这样做的..如果有什么不清楚的地方,请询问:)
感谢您的支持!
发布于 2010-10-30 00:13:52
您还没有指明用于枚举和读取TCollectionItems的TCollection方法的原型,以及其他所需的详细信息。
然而,这肯定是由:The Composite Design Pattern解决的。
此模式的目的是遍历递归表单,并将对组合的调用转发到它的合成器上,依此类推,直到它到达叶子(在您的例子中是带有空TCollection的TCollectionItems )
发布于 2010-11-11 10:12:40
递归访问子TCollection对象的唯一方法是使用VCL的RTTI信息,而无需知道所拥有的TCollectionItem对象的类类型,这样您就可以对它们进行类型转换。
在XE之前的C++Builder版本中,基于VCL的RTTI仅适用于__published属性。给定一个TCollectionItem (或任何通用TObject)对象指针,您可以使用TypInfo.hpp中声明的GetPropList()函数来检索该对象的已发布属性信息的列表。然后,您可以遍历该列表,检查报告TypeKind值为tkClass的所有属性。找到后,使用GetObjectProp()函数检索该属性的TObject指针值,然后在访问其子TCollectionItem对象之前使用dynamic_cast确保它确实是一个TCollection对象。
在RTTI2010中,引入了一个新的增强型C++Builder系统,在Rtti.hpp中声明,它为类的所有成员提供信息,包括未发布的属性和字段。使用这种手动RTTI,子TCollection不再需要被声明为__published属性。在这个系统中,您将使用TRttiContext类访问递归的起始TCollectionItem对象的TRttiType对象,然后使用TRttiType::GetFields()和TRttiType::GetProperties()方法查找报告代码为tkClass的子代码和TRttiField项,然后使用TRttiField::GetValue()和<代码>D25方法获得<代码>D26对象指针,该指针可以使用<代码>D28类型转换为<代码>D27指针。
https://stackoverflow.com/questions/3985720
复制相似问题