![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Здравствуйте...есть класс Tree, для добавления веток, удаления...поиска и всего остального (некоторые функции убраны из класса...что-то мне здесь не нравится...не могу сказать что, просто смотрю на код и чувствую что что-то не то...
Может я слишком самокритичен? Кому не лень помогите подправить...что в коде не то? что надо добавить, убрать...неэлегантно как-то...вобщем на ваше усмотрение...у кого какие мысли по поводу класса...
и использование...
Например мне не нравится то что пользователь класса задает в template тип std::string а итератор надо разименовывать чтобы получить...вобщем как то не стандартно...(сам написал, сам недоволен...куда катится этот мир Заранее спасибо... Это сообщение отредактировал(а) azesmcar - 22.2.2006, 11:43 |
||||
|
|||||
| MAKCim |
|
||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
а что такого? Как еще контейнерами пользоваться?
может лучше хранить указатель или типа smart_ptr<CTreeNode<T> >? потому как вроде когда создается CTree появляется сразу первый CTreeNode, хотя вначале дерево не содержит узлов (это мое ИМХО)
опять же работа с указателем (передается во внешнюю ф-ию), что небезопасно, наверно лучше опять же использовать какие-нибудь smart_ptr может быть будет разумно вообще скрыть реализацию CTreeNode поместив этот шаблон класса в private секцию CTree предоставив пользователю только итератор по CTree удачи -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||
|
|||||||
| azesmcar |
|
||||||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
А продолжение?
имеется ввиду к примеру если создать
а в моем случае если его разименовать получим указатель а не сам обьект... нестандартно...можно конечно добавлять статические обьекты но на мой взгляд это не очень-то хорошо...так как vector резервирует память, и чем больше размер обьекта, тем больше памяти он зарезервирует...потому лучше хранить указатели (на мой взгляд)...
можно...подумаю над этим...вопрос спорный, в принципе дерево без RootNode смысла не имеет...можно просто создавать его при первом же обращении...
в принципе пользователь не должен иметь возможности создавать обьект типа CTreeNode..тоже вариант..можно сделать конструктор и деструктор private и подружить классы... |
||||||||||
|
|||||||||||
| Earnest |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
1) Я бы поменяла vector на list (для хранения детей). Основание: дерево воспринимается как динамическая структура, к-я погибче вектора. Как-то подсознательно ожидаешь, что итераторы будут оставаться валидными после любых операций (кроме удаления).
2) Не нравится разыменование - напиши свой итератор. Проще всего это сделать с помощью boost::iterator_adapter - всего одну функцию придется написать. 3) Согласна с MAKCim насчет скрывания TreeNode и написания итератора по всему дереву. Лучше, чтобы итератор разыменовывался в тип T, а не в TreeNode. Здесь тоже рулит iterator_adapter. 4)
Это нормально. Просто "правильные" пользователи сачала напишут
И все будет красиво. Еще раз повторюсь, итератор-адаптер для твоего случая очень подходит, рекомендую ознакомиться. -------------------- ... |
||||
|
|||||
| MAKCim |
|
||||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
только не дружба!
можно хранить указатели но можно создать свой итератор (точнее обертку над std::vector< CTreeNode<T>* >::iterator)
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||||
|
|||||||||
| azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Все больше склоняюсь к этому решению...к сожалению boost -а нету...и инсталировать его тоже никто в нашей фирме (пока что) не собирается..можно посмотреть как реализовано или скопировать... Но возникают некоторые вопросы...тогда надо будет убрать все что написано и изменить структуру... т.е. будут функции
И тому подобное..но как тогда получить из итератора parent если вся имплементация CTreeNode будет скрыта от пользователя...нужно к примеру пройтись по child -ам конкретного node -а...но не рекурсивно...а обычно, только для immediate-childs..проверить есть ли у какой либо ветки дети для функции (is_leaf)...и множество других воросов..как же быть с ними? |
||||
|
|||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Это всё не задача итератора. Он должен только осуществлять обход (operator++() и прочие). А все датали реализации это уже дело Node, а значит его совсем от клиентского кода скрывать не следует |
|||
|
||||
| azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Ну...так и я об этом
получай обьект в свое удовольствие...добавляй child-ы...получай любую информацию...если скрыть node все это будет недуступно..какой же тогда смысл строить дерево? |
||||
|
|||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Ну на самом деле класс дерева нужен чтобы хранить root |
|||
|
||||
| MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
все равно раскрывается реализация Node, что не есть хорошо можно создать псевдо Node с одним открытым методом - получение итератора на первый из child-ов, объект которого возвращает итератор (можно создать разновидности итератора для прохода дерева в прямом, обратном, ... порядке) tree, в конечном итоге важен ведь не Node, а значение в нем -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |