Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Указатели на функции 
:(
    Опции темы
IEHBR
Дата 4.2.2005, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 22.9.2004

Репутация: нет
Всего: нет



экспериментировал с указателями на функцию
если приравнивать от функции класса то не прокатывает

прокатывает тока тада если определить функцию как static или
сделать её глобальной
а не хотелось бы...
мона как нить этого избежать?

Код:

typedef void*(*MYFUNC)(...);
/*...*/
MYFUNC a;
a = (MYFUNC) tmes->AuthClient; //где tmes - указатель на экземпляр
//класса
a();


PM   Вверх
Hroft
Дата 4.2.2005, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 20.10.2003
Где: Москва

Репутация: нет
Всего: 3



Скажи пожалуйста, а к членам какого экземпляра этого класса будет эта функция иметь доступ? Не знаешь? Ну вот и компилятор не знает.
Если в билдере пишешь, то привязаться можно с помощью __closure. А вообще - нельзя так делать. Пока, по крайней мере.
PM MAIL ICQ   Вверх
IEHBR
  Дата 4.2.2005, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 22.9.2004

Репутация: нет
Всего: нет



class b
{
public:
void test();
};

....
void(b::*FUNC_P)();
FUNC_P = &b::test; // take a method's address
....
//usage
b a_1;
(a_1->*FUNC_P)(); // call via method's pointer

Вызов метода без объекта - ошибка!

Добавлено @ 14:12
а то - нельзя нельзя....
все можно smile
PM   Вверх
azesmcar
Дата 4.2.2005, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата
Скажи пожалуйста, а к членам какого экземпляра этого класса будет эта функция иметь доступ? Не знаешь? Ну вот и компилятор не знает.
Если в билдере пишешь, то привязаться можно с помощью __closure. А вообще - нельзя так делать. Пока, по крайней мере.


Для всех экземпляров функций создается одна копия каждой функции...просто вместе с остальными переменными передаеться также невидимый this и простой ковертацией здесь не обойтись. static функциям указатель this не передается, вот потому то и работает...

IEHBR
Так - другое дело...
PM   Вверх
S.A.P.
Дата 4.2.2005, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: 9
Всего: 71



Цитата(IEHBR @ 4.2.2005, 14:10)
(a_1->*FUNC_P)(); // call via method's pointer

Вызов метода без объекта - ошибка!

Добавлено @ 14:12
а то - нельзя нельзя....
все можно smile

Это то понятно. У тебя же экземпляр уже создан, пробле с определением адреса нет.

А мне вот интересно this.func; вернет адрес функции, если я воспользуюсь этим в самом классе (например в конструкторе)??? .

Это сообщение отредактировал(а) Perchilla - 4.2.2005, 15:00
PM MAIL   Вверх
Hroft
Дата 4.2.2005, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 20.10.2003
Где: Москва

Репутация: нет
Всего: 3



Конечно, но в первом посте ты не пытался ->* применить, который, как я понимаю, так и делает, как azesmcar говорит: еще и this передает.
Цитата
и простой ковертацией здесь не обойтись.

это точно. Но можно создавать не простой указатель на функцию, а "умный", который будет хранить также и сам объект. Паттерн Command, короче говоря.
PM MAIL ICQ   Вверх
Олег М
Дата 8.2.2005, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

Репутация: 7
Всего: 7



Цитата(Hroft @ 4.2.2005, 18:52)
это точно. Но можно создавать не простой указатель на функцию, а "умный", который будет хранить также и сам объект. Паттерн Command, короче говоря.

Стопудово можно! Создавай! Только при вызове метода, не забывай определять указатель на класс (который this)
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0836 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.