2010-10-21 2 views
1

Я очень плохо с рекурсией, никогда не использовал ее раньше. Я знаю теорию этого .. не то, что помогает :)) Для моей проблемы у меня есть структура TCollection, которая содержит TCollection и TCollectionItem и т. Д. Мне нужно написать функцию рекурсии, которая будет читать все мои TCollectionItems. Вот графическое представление:Рекурсивное чтение TCollection

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

TCollection может иметь 1 или даже 2,3 TCollection под ним или нет.

Вот несколько примеров:

TCollection-> TCollectionItem

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

и т.д ..

Пожалуйста скажите мне, если я плохо описал проблему, я, вероятно, сделал .. спросите, если что-то неясно :)

Спасибо за Поддержка!

+0

методы прототипов для итерации по TCollection? –

+0

Как узнать, что TCollectionItems принадлежит TCollection? –

+0

TCollectionItems владеет TCollection, если свойство Count больше, чем 0. – krizajb

ответ

1

Вы не указали прототипы методов TCollection, чтобы перечислять и читать ваши TCollectionItems и другие необходимые данные.

Однако это определенно решает вопрос: The Composite Design Pattern.

Цель этого шаблона пройти рекурсивную форму, и направить вызов на композит на его композанты и так далее, пока что не достигнет листьев (TCollectionItems с пустым TCollection в вашем случае)

1

Единственный способ рекурсивно обращаться к дочерним объектам TCollection, не зная типов классов принадлежащих объектам TCollectionItem, поэтому вы можете вводить их в листинг, использовать информацию RTTI VCL.

В версиях C++ Builder до XE VCL-based 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() методы искать ребенок TRttiField и TRttiProperty элементов, показавших TypeKind из tkClass, а затем использовать TRttiField::GetValue() и TRttiProperty::GetValue() методы для получения указателя на объект TObject, который может быть введен в тип с помощью указателя TCollection с dynamic_cast.

 Смежные вопросы

  • Нет связанных вопросов^_^