1

私は再帰が非常に苦手で、これまで使用したことがありません。私はそれの理論を知っています..それが役立つというわけではありません:))私の問題では、TCollectionとTCollectionItemなどを含むTCollectionの構造があります..すべてのTCollectionItemを読み取る再帰関数を作成する必要があります。ここにグラフィカルなビューがあります:

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

TCollection は、その下に 1 つまたは 2、3 個の TCollection を持つことも、何も持たないこともできます。

次にいくつかの例を示します。

TCollection->TCollectionItem

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

など..

私が問題をひどく説明したかどうか教えてください..何か不明な点があれば聞いてください:)

ご支援ありがとうございます!

4

2 に答える 2

1

TCollectionItems を列挙して読み取るための TCollection メソッドのプロトタイプや、その他の必要な詳細を示していません。

ただし、これは次の方法で確実に解決されます: The Composite Design Pattern .

このパターンの目的は、再帰的なフォームをトラバースし、コンポジットの呼び出しをその構成要素などに転送して、リーフに到達することです (この場合、空の TCollection を持つ TCollectionItems )。

于 2010-10-29T16:13:52.407 に答える
1

子オブジェクトに再帰的にアクセスする唯一の方法TCollectionは、所有しているTCollectionItemオブジェクトのクラス型を知らずに型キャストできるため、VCL の RTTI 情報を使用することです。

XE より前のバージョンの C++Builder では、VCL ベースの RTTI は__publishedプロパティでのみ使用できます。TCollectionItem(または任意の一般的な)オブジェクト ポインターを指定すると、 で宣言されTObjectた関数を使用して、そのオブジェクトの公開されたプロパティ情報のリストを取得できます。次に、そのリストをループして、TypeKind 値を報告するプロパティをチェックします。見つかったら、関数を使用してそのプロパティのポインター値を取得し、子オブジェクトにアクセスする前にそれが実際にオブジェクトであることを確認するために使用します。GetPropList()TypInfo.hpptkClassGetObjectProp()TObjectdynamic_castTCollectionTCollectionItem

C++Builder 2010 では、新しい拡張 RTTI システムが導入され、 で宣言されました。このシステムはRtti.hpp、公開されていないプロパティやフィールドを含む、クラスのすべてのメンバーに関する情報を提供します。この強化された RTTI により、子をプロパティTCollectionとして宣言する必要がなくなりました。__publishedこのシステムでは、TRttiContextクラスを使用TRttiTypeして再帰の開始TCollectionItemオブジェクトのオブジェクトにアクセスし、 および メソッドを使用して TypeKind の を報告する子およびアイテムを探し、TRttiType::GetFields()およびメソッドをTRttiType::GetProperties()使用して型になり得るオブジェクト ポインターを取得します。 - でポインタにキャスト。TRttiFieldTRttiPropertytkClassTRttiField::GetValue()TRttiProperty::GetValue()TObjectTCollectiondynamic_cast

于 2010-11-11T02:12:40.473 に答える