首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TCollection的递归读取

TCollection的递归读取
EN

Stack Overflow用户
提问于 2010-10-21 16:51:18
回答 2查看 314关注 0票数 1

我很不擅长递归,以前从未用过它。我知道它的原理..这没什么帮助:))对于我的问题,我有一个包含TCollection和TCollectionItem等的TCollection结构。我必须编写一个递归函数来读取我所有的TCollectionItems。这是图形化视图:

TCollection->TCollectionItem(s)->TCollection->TCollectionItem(s)

TCollection下可以有1个甚至2,3个T集合,或者一个都没有。

下面是更多的例子:

TCollection->TCollectionItem

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

等等。

如果我描述的问题不好,请告诉我,我可能是这样做的..如果有什么不清楚的地方,请询问:)

感谢您的支持!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-30 00:13:52

您还没有指明用于枚举和读取TCollectionItems的TCollection方法的原型,以及其他所需的详细信息。

然而,这肯定是由:The Composite Design Pattern解决的。

此模式的目的是遍历递归表单,并将对组合的调用转发到它的合成器上,依此类推,直到它到达叶子(在您的例子中是带有空TCollection的TCollectionItems )

票数 1
EN

Stack Overflow用户

发布于 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指针。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3985720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档