Ты бы написал подробней, что тебе надо и для чего.
Насколько я понял, тебе нужно нужно хранить в списке некие элементы, причем элемент может быть либо собственно "элементом",
либо контейнером "элементов", каждый из которых так же может быть списком элементов, каждый из которых...........
Или у тебя каждый элемент списка содержит еще и список других элементов?
Я же не знаю твою задачу, поэтому и предложил композицию для начала.
Изначально - такая штука понадобилась для реализации своей обертки для меню программы. Кстати, я ее уже полностью реализовал, использую именно ту конструкцию - вроде все работает
Если коротко, "композиция" подразумевает что:
Есть базовый класс, который определяет общий интерфейс.
Есть "листовые" классы-наследники, представляющие собст-но "элементы", есть классы-контейнеры, содержащие списки указателей базового класса.
Т. о., имея указатель на базовый класс, клиент работает через единый интерфейс как с простыми, так и составными объектами.
Все, понял. Просто недавно программирую с использованием классов, поэтому и не знаю всех способов его применения - довольно красивый спосоп, надо сказать
Хм, а как в твоем случае обращатся к произвольному элементу дерева?
tree[1][2][3] или tree[1][2][3][4][5]?
Именно - ради этого я и заводил такой вот класс... чтобы к менюхе был удобный доступ (он чем-то похож на доступ к менюхе из VBA под Access97, под которым я в свое время плотно работал - там мне нравилось, вот и тут захотел
)
Вот пример, как используется класс (кусок, где идет работа с менюхой):
CMenu Menu;
Menu.InitMenu(m_hWnd); // Инициализация класса менюхи и ее самой
Menu.CreateMenu("&File",0,MF_STRING,NULL); // Создаем подменю
// Дальше идет добавление пунктов меню
Menu[0].AddMenu(IDCMD_START_NEW_SEANS, "New", 0, MF_STRING,NULL);
Menu[0].AddMenu(IDCMD_STOP_CURRENT_SEAND, "Close", 1, MF_STRING,NULL);
Menu[0].AddMenu(IDCMD_CLOSE_APP, "Exit", 2, MF_STRING,NULL);
return 0;
Как видишь, обращение абсолютно одинаковое как к переменной Menu, так и к конструкции Menu[0] - они оказываются одного типа
Т.о., в общем случае я могу обращаться хоть Menu[1]..<n раз>...[n], хоть указывая любые другие индексы и получу объект типа CMenu, с которым могу делать все то же самое, что и с корнем
Как раз таки дерево получается абсолютно любого уровня, т.к. Composite содержит указатели на базовый класс, а объекты, на которые они указывают, могут быть как листовыми, так и теми же Composite-ами.
угу, я понял.. но все-таки, щас обращение не такое удобное получается к объектам
Да вроде нонсенса тут никакого нет.
меня тут, сообственно, смущает только то, что базовый класс специализируется через дочерний (или наоборот - дочерний класс определяется через шаблон, специализированный через потомка.. :? ). Довольно трудно себе представить такую картину, при том, что принцип ООП позволяет создавать "прозрачные" программы.