Как использовать имя функции в качестве параметра?

0

Я попытался передать имя функции в качестве параметра, как показано ниже:

class RemoteControlMonitor {
private:
    void (*rph)(unsigned int key);
    void (*rrh)(unsigned int key);

public:
    RemoteControlMonitor(void (*pressed)(unsigned int key), 
                     void (*released)(unsigned int key) = 0) {
     *rph = pressed;
     *rrh = released;
     lr_set_handler(remote_control_handler);
    }

    void runPressed() {
     while (!shutdown_requested()) {
         remote_key = 0;
         remote_etype = 0;
         wait_event(&remote_control_pressed, 0);

             if (*rph) {
                 (*rph)(remote_key);
             }
         }
     }
 };

когда я его компилирую, ошибка такова, как показано ниже, что я могу сделать?

RemoteControlMonitor.H: В методе 'RemoteControlMonitor :: RemoteControlMonitor (void() (unsigned int), void() (unsigned int) = 0)':

RemoteControlMonitor.H: 61: назначение только для чтения

RemoteControlMonitor.H: 61: присвоение void()(unsigned int)' from void (*) (unsigned int)'

RemoteControlMonitor.H: 62: назначение только для чтения

RemoteControlMonitor.H: 62: присвоение void()(unsigned int)' from void (*) (unsigned int)'

  • 1
    *rph = pressed => rph = pressed (потерять звезду).
Теги:
function
parameters

2 ответа

2
Лучший ответ

попробуйте использовать typedef, это будет более понятно.

typedef  void (*keyaction)(unsigned int key);

class RemoteControlMonitor {
private:
    keyaction rph;
    keyaction rrh;

public:
    RemoteControlMonitor(keyaction pressed, 
                     keyaction released = NULL) {
     rph = pressed;
     rrh = released;
     lr_set_handler(remote_control_handler);
    }

    void runPressed() {
     while (!shutdown_requested()) {
         remote_key = 0;
         remote_etype = 0;
         wait_event(&remote_control_pressed, 0);

             if (rph) {
                 (*rph)(remote_key);
             }
         }
     }
 };

РЕДАКТИРОВАТЬ:

эта функция переходит к конструктору:

void f(unsigned int){}

вы заявляете следующее:

RemoteControlMonitor  rcm(f);
  • 0
    Я попробовал ваш код, теперь я получил ошибку, как показано ниже:
  • 0
    RemoteControlMonitor.H: 58: недопустимый тип void *' for default argument to void (*) (unsigned int)'
Показать ещё 5 комментариев
1

вам не нужно *rph указатель, *rph, просто называть его нормальным, как rph и он должен работать нормально, другой мудрый вы пытаетесь установить указатель *rph на нажатие, а не на его значение.

*rph = pressed означает, что моя *rph = pressed памяти pressed, где rph = pressed означает, что мое значение pressed.

Эта ссылка содержит некоторую полезную информацию в отношении ссылок, указателей и разыменований.

Надеюсь это поможет:)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню