![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| wpp |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 25.5.2003 Репутация: нет Всего: нет |
приведения указателя на метод класса к указателю на функцию, возможно ли?
|
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Иногда возможно через reinterpret_cast. Практической пользы ноль.
-------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| wpp |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 25.5.2003 Репутация: нет Всего: нет |
Ну а если есть функция (С), которая в качестве параметра принимает указатель на функцию, а мне надо впарить ей указатель на метод класса?
|
|||
|
||||
| Neitron |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 3.10.2005 Где: Москва Репутация: 2 Всего: 5 |
wpp
Длина указателя на ф-ции нестатическая. -------------------- Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей. Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ |
|||
|
||||
| wpp |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 25.5.2003 Репутация: нет Всего: нет |
Neitron Для меня, к сожалению, Ваше высказывание крайне загадочно... Нельзя ли подоходчивей?
|
|||
|
||||
| Neitron |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 3.10.2005 Где: Москва Репутация: 2 Всего: 5 |
wpp
Чтобы передать указатель на ф-цию, нужно знать его точный размер. Длина указателя на разного типа ф-ции разная. Это конечно не факт, но она не обязана быть одинаковой. Если работаешь в Билдере, можешь воспользоваться методом __closure с помощью которого можно создать тип указателя на функцию член. Нечто вроде
Это сообщение отредактировал(а) Neitron - 18.11.2005, 12:41 -------------------- Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей. Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ |
|||
|
||||
| SergeCpp |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 955 Регистрация: 8.8.2005 Где: At Home Репутация: 15 Всего: 124 |
Можно, только если это статический метод класса...
Если не статический, то читайте здесь Это сообщение отредактировал(а) SergeCpp - 15.12.2006, 10:48 |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
wpp дело не только в размере указателя,
даже если он 4 байта, как у простых классов MSVC, передать-то можно, а вот при вызове что ты получишь? большой ОЙ. У тебя 2 варианта: Если код, которому нужно передать указатель на функцию, можно переписать - перепиши - либо добавь дополнительный параметр (указатель на объект) + статические оболочки для методов класса. А может там уже есть дополнительный параметр? Либо вообще перепроектируй, используя что-то вроде делегатов. Простую реализацию можешь сам написать, либо возьми boost::function (а может и еще что есть). Если код чужой или переписывать его никак невозможно, то, если нет дополнительного параметра, через который можно передать указатель на объект, остаетcя только этот указатель куда-нибудь запихивать (в статическую переменную напр.). Но это очень негибкий путь... Ну или в зависимости от задачи искать пути. -------------------- ... |
|||
|
||||
| wpp |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 25.5.2003 Репутация: нет Всего: нет |
Мда... С++ действительно достоин замены...
В ней я изменения вносить не хочу. Мой метод:
Как передать второе первому |
||||
|
|||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Объявляешь ф-цию статической.
Далее так static someclass:function -> в первую легко передается this -> передаешь через data требуемый аргумент -> someclass::argument Около того:
-------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| np9mi7 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
Товарищи, указатель на метод - это вообще не тип (если исключить расширения языковые, типа __closure), так что это не возможно для ANSI C++
|
|||
|
||||
| Mayk |
|
||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Здрасьте. А что это такое?
Это сообщение отредактировал(а) Mayk - 19.11.2005, 14:47 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||
|
|||||
| np9mi7 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
Это сообщение отредактировал(а) np9mi7 - 19.11.2005, 15:06 |
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
эээ. А разве &Hello::print и geronimo->*pActivity имеют один и тот же тип? Что такое pActivity - если не указатель на метод? -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |