![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Mormishka |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 236 Регистрация: 25.8.2010 Репутация: нет Всего: нет |
Как передать указатель на функцию-член одного класса другому?
Пишет
|
||||
|
|||||
alexvs11 |
|
||||
hell is here ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 21.8.2010 Репутация: 2 Всего: 10 |
несколько способов
1) стандартный способ использования указателей на функции-члены, ну тут в гугл http://www.gamedev.ru/code/faq/?id=3599 2) в стл
3) в новом стандарте использования std::function (аналогично в бусте)
Добавлено через 1 минуту и 18 секунд главное помнить, что указатель на функцию член зависит от двух вещей 1) смещение в классе, те &X::foo 2) адреса самого объекта |
||||
|
|||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Да что ты?!? ![]() Сколько лет знаю С++, но никогда и не догадывался, что размещение подпрограммы в области кода как-то зависит от адреса объекта и количества членов перед ней в определении класса. Mormishka, тип указателя должен быть int (A::*pFunc)(int). Вызывать нужно так: int r = (a.*pfunc)(x) или int r = (pa->*pfunc)(x), где a - объект типа A, pa - указатель на объект типа A Это сообщение отредактировал(а) bsa - 27.3.2011, 18:33 |
|||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 6 Всего: 118 |
bsa, однако чувак говорит не про подпрограмму, а про сам указатель. И да, он хитрее устроен, чем обычный указатель на функцию (подробнее: раз и два)
Это сообщение отредактировал(а) jonie - 27.3.2011, 12:41 -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
alexvs11 |
|
|||
hell is here ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 21.8.2010 Репутация: 2 Всего: 10 |
ну да, ну да, ну да, а поля объекта как она получает? данные объекта функция-член получает через указатель this, который является адресом объекта ![]() |
|||
|
||||
mes |
|
||||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
_обладает_ ли f() в этих примерах разным смещением ? Добавлено через 2 минуты и 18 секунд
а указатель на функцию член тоже получает данные через this ? а то из высказываний не совсем понятно, что имеете ввиду... |
||||||
|
|||||||
alexvs11 |
|
||||||
hell is here ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 21.8.2010 Репутация: 2 Всего: 10 |
не знаю как их можно сравнить, ибо приведение к int не работает и сравнение для разных классов тоже, но
дает false
скажем так, для доступа к функции-члену нужно смещение и адрес объекта, что в этом не есть очевидное? ну уж то что виртуальная функция зависит от адреса объекта то уж точно сомнений нет? Добавлено через 12 минут и 5 секунд вот собсно ответ на вопрос автора
Это сообщение отредактировал(а) alexvs11 - 27.3.2011, 16:51 |
||||||
|
|||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
1. смещение функции в чем ? 2. для доступа к функции-члену адрес объекта не нужен.. а для вызова функции члены только адреса объекта мало, нужен и тип.. 3. указатель на функцию и имя функции имеют разное поведение ( при вызове) |
|||
|
||||
alexvs11 |
|
|||
hell is here ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 21.8.2010 Репутация: 2 Всего: 10 |
||||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
alexvs11 |
|
|||
hell is here ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 21.8.2010 Репутация: 2 Всего: 10 |
это умная демагогия про то чем отличается функция от ее вызова?
|
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
я пытаюсь заострить Ваше внимание, на не совсем корректном восприятии функции.. по крайней мере такое впечатление сложилось после Ваших высказываний.. к посту тс мои замечания фактически не относятся.. |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
||||
|
||||
alexvs11 |
|
|||
hell is here ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 21.8.2010 Репутация: 2 Всего: 10 |
||||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
это не пройдет когда нам нужно сделать из метода с-делегат ( например void(*cb)(void *); ) |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |