как получить указатель на функцию класса?

Тема в разделе "LANGS.C", создана пользователем Quark, 3 янв 2008.

  1. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    Есть некоторый класс. Как получить указатель на func1?

    Код (Text):
    1. class Class
    2. {
    3. private:
    4.     void func1(int a) { a++; }
    5. public:
    6.     void func2()
    7.     {
    8.         void *p;
    9.  
    10.         p   =   (void*)func1;
    11.         p   =   (void*)this->func1;
    12.     }  
    13. };
    В итоге ошибки:

    E:\VC6\progs\temps\temp8\main.cpp(19) : error C2440: 'type cast' : cannot convert from 'void (__thiscall Class::* )(int)' to 'void *'
    There is no context in which this conversion is possible
    E:\VC6\progs\temps\temp8\main.cpp(20) : error C2440: 'type cast' : cannot convert from 'void (__thiscall Class::* )(int)' to 'void *'
    There is no context in which this conversion is possible
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Либо указатель на статическую функцию, либо указатель на член (void Class::*pFunc1(int) = &Class::func1; this->*pFunc1(0); )
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    А зачем тебе этот указатель?.. наверняка есть более нормальные методы)
     
  4. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    Посчитать offset вызова надо.

    Указатель нужно получить на саму функцию. хотя, можно и на член сласса + разименование.

    Ещё момент. Такая штука срабатывает нормально, компилятор не жалуется. DBG_PRINT("%08X",this->func1);
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    совершенно разные вещи
     
  6. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    А в чём разница? В том, что функция может быть статической и класс может вообще не содержать указателя на неё?
    В любом случае нужен указатель на саму функцию.
     
  7. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Quark

    Разница в том, что набор функций только один, а объектов класса может быть сколько угодно. Функции и объекты хранятся в разных, независимых местах. Одно из другого получить нельзя.

    Указатель на функцию это &Class::func1
     
  8. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    (unsigned long)&SetHook::HookCode - (unsigned long)pOrigFunction - 10;

    z:\mysource\commerce\keylogger\hook_ws2\inc.h(54) : error C2440: 'type cast' : cannot convert from 'int (__thiscall SetHook::* )(void)' to 'unsigned long'
     
  9. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Все верно, c-cast не умеет преобразовывать указатели на функции в интежеры. Преобразовывай в const char*, через const void*.
     
  10. Gordon

    Gordon New Member

    Публикаций:
    0
    Регистрация:
    21 апр 2005
    Сообщения:
    21
    Адрес:
    Russia
    Вот здесь кажись хорошая статья (или рядом где то)

    http://www.rsdn.ru/article/cpp/fastdelegate.xml
     
  11. RedLord

    RedLord Member

    Публикаций:
    0
    Регистрация:
    23 июн 2005
    Сообщения:
    183
    Адрес:
    Ukraine
    Quark
    не понимаю зачем.
    как вариант - напиши шаблонную функцию для получения адреса

    P.S.
    и смущает
     
  12. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    RedLord

    [offtopic]
    Здарова. Ты чего не в ICQ? :)
    [/offtopic]