![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
nikakoi |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 176 Регистрация: 6.5.2006 Репутация: нет Всего: нет |
Доброго всем утра.
Расскажите плз, что такое указатель на функцию... и желательно с примером.. Ато все, что я в инете нашел слишком непонятно ![]() |
|||
|
||||
586 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2243 Регистрация: 8.5.2006 Репутация: 10 Всего: 146 |
Это адрес на какую-либо область кода.
Указатель на функцию возвращает, например, функция GetProcAddress. Любая функция, по сути, является адресом, только имеет ещё и параметры.
Это сообщение отредактировал(а) 586 - 28.6.2006, 10:58 |
|||
|
||||
BreakPointMAN |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 14 Всего: 24 |
nikakoi, почему ты считаешь, что мы расскажем тебе понятнее?
-------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
|||
|
||||
nikakoi |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 176 Регистрация: 6.5.2006 Репутация: нет Всего: нет |
Ну здесь по крайней мере я могу попросить рассказать понятнее..
А в литературе никому и не пожалуешься |
|||
|
||||
slava72 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 23.6.2006 Репутация: 1 Всего: 1 |
Вариантов использования - вагон и маленькая тележка ;)) Например - хранение в члене класса, и вызов соответствующей функции (можно назвать суперполиморфизм )) массив уазателей на функцию для замены switch Организация "фабрики классов" - список пар <ключ (например строка), функция создания объекта> Соответственно можно динамически создавать объект нужно класса, по ключу не известному в момент компиляции и т.д. |
|||
|
||||
bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 3 Всего: 317 |
в контексте C
указатель на ф-ю - это переменная, содержащая адрес функции типа описанного в объявлении этой переменной. позволяет напр, под одним именем скрывать вызов нескольких функций похожего вида(1), или осуществлять callback. 0) объявление и инициализация:
т.е. в конце вызывается функция compare_int, a в блок if,else можно также засунуть любую переменную вида element, несмотря на факт что data может быть совершенно разных видов. это также используется для замены switch на 1 вызов массива указателей на функции про callback писАть не буду, потому, что колбэк это то же самое, просто когда функции compare_* пишутся в другом модуле, и тот модуль может быть более низкого/высокого уровня абтракции, а также может быть написан другой командой. надеюсь не запутал. пока. Это сообщение отредактировал(а) bilbobagginz - 28.6.2006, 11:36 -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
nikakoi |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 176 Регистрация: 6.5.2006 Репутация: нет Всего: нет |
![]() Кажется начал понимать.. |
|||
|
||||
Xenon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
А зачем оно надо, скажите мне?
![]() |
|||
|
||||
MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
примеров очень много главное - оно точно надо ![]() первое, что в голову пришло
реализации интерфейса object могут быть в другом месте и creator о них не знает, а знают функции создания с сигнатурой object* () Это сообщение отредактировал(а) MAKCim - 28.6.2006, 13:35 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
Ryn |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 21.4.2006 Репутация: нет Всего: нет |
а если мне нужен указатель на функцию, находящуюся в классе ?
|
|||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Ryn, такие указатели тоже есть, но они не привязаны к конкретному экземпляру класса. Чтобы вызвать метод через указатель на него, нужен сам указатель и объект.
Если нужна привзяка к конкретному экземпляру, используются специальные объекты-функцторы. См. Boost.Function и Boost.Bind. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
Ryn |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 21.4.2006 Репутация: нет Всего: нет |
спасибо
|
|||
|
||||
AlanG |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 11.5.2006 Где: РашЫн ФидирейшЫн Репутация: нет Всего: нет |
Я извиняюсь, если не в тему спрошу, но у меня возникли непонятки с типами указателей, когда имя указателя становится новым типом.
Например:
Получается тип указателя на функцию, предполагает указатель на функцию которая принимает и возвращает теже типы данных, что и указатель на функцию который и установил новый тип (ff1 в данном случае). Просьба прокоментировать вышеизложенное. |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
AlanG,
а что тебе не нравится? ты определил синоним типа int (*)(int,char), назвал его ff1, и далее создал массив из элементов этого типа, в данном случае из указателей на функции твой код аналогичен слудующему
Это сообщение отредактировал(а) MAKCim - 29.6.2006, 11:04 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
slava72 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 23.6.2006 Репутация: 1 Всего: 1 |
AlanG,
Это не "Массив ссылок на функции с типом ff1", а массив указателей на функцию типа ff1. для функции выражения &func и func - это одно и тоже Ryn, Одно уточнение - статические функции класса - это обычные функции, а не члены класса, т.е. их можно использовать в контексте обычных указателей на функцию. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |