| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > template Tree list что не так? |
| Автор: azesmcar 22.2.2006, 11:37 | ||||
| Здравствуйте...есть класс Tree, для добавления веток, удаления...поиска и всего остального (некоторые функции убраны из класса...что-то мне здесь не нравится...не могу сказать что, просто смотрю на код и чувствую что что-то не то... Может я слишком самокритичен? Кому не лень помогите подправить...что в коде не то? что надо добавить, убрать...неэлегантно как-то...вобщем на ваше усмотрение...у кого какие мысли по поводу класса...
и использование...
Например мне не нравится то что пользователь класса задает в template тип std::string а итератор надо разименовывать чтобы получить...вобщем как то не стандартно...(сам написал, сам недоволен...куда катится этот мир Заранее спасибо... |
| Автор: MAKCim 22.2.2006, 18:57 | ||||||
а что такого? Как еще контейнерами пользоваться?
может лучше хранить указатель или типа smart_ptr<CTreeNode<T> >? потому как вроде когда создается CTree появляется сразу первый CTreeNode, хотя вначале дерево не содержит узлов (это мое ИМХО)
опять же работа с указателем (передается во внешнюю ф-ию), что небезопасно, наверно лучше опять же использовать какие-нибудь smart_ptr может быть будет разумно вообще скрыть реализацию CTreeNode поместив этот шаблон класса в private секцию CTree предоставив пользователю только итератор по CTree удачи |
| Автор: azesmcar 22.2.2006, 20:25 | ||||||||||
А продолжение?
имеется ввиду к примеру если создать
а в моем случае если его разименовать получим указатель а не сам обьект... нестандартно...можно конечно добавлять статические обьекты но на мой взгляд это не очень-то хорошо...так как vector резервирует память, и чем больше размер обьекта, тем больше памяти он зарезервирует...потому лучше хранить указатели (на мой взгляд)...
можно...подумаю над этим...вопрос спорный, в принципе дерево без RootNode смысла не имеет...можно просто создавать его при первом же обращении...
в принципе пользователь не должен иметь возможности создавать обьект типа CTreeNode..тоже вариант..можно сделать конструктор и деструктор private и подружить классы... |
| Автор: MAKCim 22.2.2006, 20:52 | ||||||||
только не дружба!
можно хранить указатели но можно создать свой итератор (точнее обертку над std::vector< CTreeNode<T>* >::iterator)
|
| Автор: azesmcar 23.2.2006, 11:15 | ||||
Все больше склоняюсь к этому решению...к сожалению boost -а нету...и инсталировать его тоже никто в нашей фирме (пока что) не собирается..можно посмотреть как реализовано или скопировать... Но возникают некоторые вопросы...тогда надо будет убрать все что написано и изменить структуру... т.е. будут функции
И тому подобное..но как тогда получить из итератора parent если вся имплементация CTreeNode будет скрыта от пользователя...нужно к примеру пройтись по child -ам конкретного node -а...но не рекурсивно...а обычно, только для immediate-childs..проверить есть ли у какой либо ветки дети для функции (is_leaf)...и множество других воросов..как же быть с ними? |
| Автор: Daevaorn 23.2.2006, 11:30 | ||
Это всё не задача итератора. Он должен только осуществлять обход (operator++() и прочие). А все датали реализации это уже дело Node, а значит его совсем от клиентского кода скрывать не следует |
| Автор: azesmcar 23.2.2006, 11:39 | ||||
Ну...так и я об этом
получай обьект в свое удовольствие...добавляй child-ы...получай любую информацию...если скрыть node все это будет недуступно..какой же тогда смысл строить дерево? |
| Автор: Daevaorn 23.2.2006, 12:06 |
| Ну на самом деле класс дерева нужен чтобы хранить root |
| Автор: MAKCim 23.2.2006, 18:24 | ||||
все равно раскрывается реализация Node, что не есть хорошо можно создать псевдо Node с одним открытым методом - получение итератора на первый из child-ов, объект которого возвращает итератор (можно создать разновидности итератора для прохода дерева в прямом, обратном, ... порядке) tree, в конечном итоге важен ведь не Node, а значение в нем |