![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| sgrey |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 265 Регистрация: 15.4.2006 Репутация: нет Всего: 4 |
смотрел одну из имплементаций бинарного дерева и в коде нашёл такую вещь
используется это дело в функциях
я так понимаю что первая запись - это способ передать функцию как параметр в функцию... такие вопросы: 1) Зачем поинтер к типу функции? 2) Для работы с данными класса можно написать внутренний метод - зачем так изголяться? какие преимущества? 3) Как это дело работает? как мне в функцию FunctionType добавить функциональность? например - удалить посещаемый элемент.... далее, имеется такая функция
зачем поинтер и ссылка вместе? разве только передача поинтера не даёт нам тойже, даже большей функциональности как и передача ссылки ? заранее спасибо! ) |
||||||
|
|||||||
| zkv |
|
||||||||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
чтобы можно было передать любую функцию с такой сигнатурой
не понятен вопрос
FunctionType - это тип а не функция, ты можешь определить свою функцию:
и передать ее в функцию preorder, а он (этот preorder) ее применит (а может нет - без реализации нельзя сказать) для некоторых элементов.
они тут не вместе, здесь мы имеем ссылку на указатель Это сообщение отредактировал(а) zkv - 25.12.2007, 20:25 |
||||||||
|
|||||||||
| JackYF |
|
||||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
В обоих случаях ты можешь изменить значение по указателю. Передавая же указатель не по ссылке, ты не можешь изменить значение самого указателя.
Прочитай, к примеру, Design Patterns от Банды 4-х. Паттер "посетитель", емнип, не предполагает деструктивных действий по отношению к посещаемому элементу. Удаление я бы сделал функцией класс без всяких изгаляний - результат удаления не зависит от того, в каком порядке идёт удаление. указатель на функцию. Ему можно присвоить адрес любой функции в райтайме. Примеры и т.д. - в учебниках есть. |
||||
|
|||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
1) Это объявление типа "указатель на функцию"; синтаксис такой
2) Судя по всему там у тебя паттер визитер реализуется... Да, для одного алгоритма проще написать функцию прямо в классе. Т.е. обойти дерево и сделать с каждым узлом нечто. Но если нужно второй метод обработки, третий... десятый... Что, каждый раз писать обход по новой? Конечно, обход дерева не слишком сложная вещь, но это общий подход. Паттерн визитер дает гибкость и отделение кода обхода дерева от кода обработки узлов. 3) FunctionType - это просто определение типа. Тебе нужно написать функцию с такой сигнатурой и передать ее в качестве параметра. В функции пиши что хошь, но вот удалять узлы не стоит (по причине сказанного в пункте 2 - может разрушится обход). Впрочем, можно реализовать обход так, чтобы при обработке узлы можно было в том числе и удалять. Только для этого тебе потребуется функция-визитер с параметром (указателем на само дерево) - ибо не имея контейнер, нельзя удалить его элемент. Разве что внутри три-итема есть ссылка на контейнер. -------------------- ... |
|||
|
||||
| sgrey |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 265 Регистрация: 15.4.2006 Репутация: нет Всего: 4 |
имею ввиду что для того чтобы работать с данными класса, можно внутри класса написать функцию, которая также будет показывать treePtr->item, как это делается visit(treePtr->item). Зачем для этого нужно создавать новый тип функции ?
ну да, это и имел ввиду - функцию типа FunctionType ) т.е. я в main потом пишу функцию, которая будет делать нужные мне операции и передаю её в preorder ? типа preorder(Tree, ViewItem); ? Добавлено через 5 минут и 35 секунд а подробней про него можно? TreeNode - это есть класс, в котором хранится сам item и ссылки на левый и правый элементы. п.с. ща сообщения до 100 добью и всем плюсики выставлю |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Подробнее ищи в сети по ключевым словам "паттерны программирования" "банда четырех". Здесь в форуме тоже были ссылки. Это из серии "это должен знать каждый" (программист)
Значит, имея только итем, можно удалить только его детей. Да и то, если это не разрушит дерево (т.е. это единственное место, где эти ссылки живут, а дерево не содержит общего счетчика или чего-то в этом роде). Добавлено через 3 минуты и 59 секунд "паттерны проектирования", конечно -------------------- ... |
|||
|
||||
| sgrey |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 265 Регистрация: 15.4.2006 Репутация: нет Всего: 4 |
пасиб, поищу надо только перестроить структуру дерева от удаляемого элемента вниз после того как удалишь родительский элемент ) функция у меня имеется, могу даже выложить если надо, но вопрос не о том) насколько я понял, то саму функцию типа FunctonType писать надо в main, и добавлять функциональность как тебе захочется ) спасибо за ответы ;) |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
"Функцию типа FunctionType" можно писать где угодно. От обычных функций она ничем не отличается. а FunctionType - это тип "указатель на функцию". И правила для него аналогичны void*. Только есть еще возможность вызывать функцию.
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Речь была о том, что для удаления итема, которое требует перестройки дерева, нужен дополнительный параметр - само дерево. Которого нет в сигнатуре FunctionType, поэтому взять его неоткуда. -------------------- ... |
|||
|
||||
| sgrey |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 265 Регистрация: 15.4.2006 Репутация: нет Всего: 4 |
ну всё дерево нам и не нужно, нужно "поднять" всех детей что идут после удалённого элемента а ссылка на корень дерева имеется в классе ) п.с. предлагаю не спорить, а то масло масленое получается |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |