На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> callback функции классов
    Есть 3 класса.
    В первом (CLOSLDriver) определен метод

    CL_ERROR_CODE HashBlock(CFWDataBlock &data_in,CFWDataBlock &data_out,int alg);

    (CFWDataBlock - мой тип данных, typedef int CL_ERROR_CODE).

    Из второго класса вызывается метод get_Cookie третьего класса (IKEFieldMaker), которому надо в качестве параметра передать HashBlock.

    В третьем классе:

    int get_Cookie(CFWDataBlock *i_cookie, CL_ERROR_CODE (*make_hash)(CFWDataBlock &, CFWDataBlock &, int));

    Во втором классе вызываю:

    the_maker->get_Cookie(&i_cookie, &CLOSLDriver::HashBlock);

    (the_maker - объект третьего класса).

    Компилятор выдает:
    "no matching function fo call to 'IKEFieldMaker::get_Cookie(CFWDataBlock *,
    CL_ERROR_CODE (CLOSLDriver::*)(CFWDataBlock&, CFWDataBlock&, int))'

    Candidates are: IKEFieldMaker::get_Cookie(CFWDataBlock *, CL_ERROR_CODE (*)(CFWDataBlock &, CFWDataBlock &, int)) "

    Пробовал вызывать

    the_maker->get_Cookie(&i_cookie, the_driver::HashBlock);

    (the_driver - объект CLOSLDriver)

    выдается:
    " no matching function for call to 'IKEFieldMaker::get_Cookie(CFWDataBlock *, <unsigned type>)' "

    В чем ошибка?
    Так понимаю проблемма здесь именно в классах, т.к. простой вызов функций работает.
    Сообщение отредактировано: lunc -
      Дело в том, что передавать нестатические методы класса в качестве callback-функций нельзя (в том виде, в каком у тебя это написано). Если HashBlock не зависит от состояния класса, то сделай ее статической - и твоя проблема решится.
        Дело в том, что
        CL_ERROR_CODE HashBlock(CFWDataBlock &data_in,CFWDataBlock &data_out,int alg);
        объявленна в абстрактном суперклассе, как виртуальная и этот суперкласс я менять не могу.
          У тебя в get_Cookie указатель обявлен как

          CODE
          CL_ERROR_CODE (*)(CFWDataBlock&, CFWDataBlock&, int)


          а должен быть по крайней мере объявлен как тебе подсказывает компайлер

          CODE
          CL_ERROR_CODE (CLOSLDriver::*)(CFWDataBlock&, CFWDataBlock&, int))


          (CLOSLDriver::*) означает указатель на мембер класса и ему в отличии от простой функции передается неявно указатель this на объект класса.



          Просто не указатель на функцию передавай в get_Cookie, а указатель на объект класса CLOSLDriver, а в самой get_Cookie тогда вызывай метод HashBlock

          Тоесть перепиши на

          CODE
          int get_Cookie(CFWDataBlock *i_cookie,  CLOSLDriver* the_driver);


          а внутри функции get_Cookie

          CODE
          the_driver->HashBlock( i_cookie );


          А если и третий класс поменять не можешь, тогда напиши обычную функию с подходящей сигнатурой и в ней создавай экземпляр класса CLOSLDriver или его потомка и вызывай метод этого класса.


          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0194 ]   [ 16 queries used ]   [ Generated: 26.04.24, 22:41 GMT ]