1

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

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

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

这里还有几个例子:

TCollection->TCollectionItem

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

ETC ..

如果我描述的问题不好,请告诉我,我可能做了..请问是否有不清楚的地方:)

感谢您的支持!

4

2 回答 2

1

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

但是,这绝对可以通过以下方式解决:复合设计模式

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

于 2010-10-29T16:13:52.407 回答
1

递归访问子TCollection对象的唯一方法是使用 VCL 的 RTTI 信息,而不知道拥有TCollectionItem对象的类类型以便您可以对它们进行类型转换。

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

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

于 2010-11-11T02:12:40.473 回答