Я попытался передать имя функции в качестве параметра, как показано ниже:
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)'
попробуйте использовать 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);
void *' for default argument to
void (*) (unsigned int)'
вам не нужно *rph
указатель, *rph
, просто называть его нормальным, как rph
и он должен работать нормально, другой мудрый вы пытаетесь установить указатель *rph
на нажатие, а не на его значение.
*rph = pressed
означает, что моя *rph = pressed
памяти pressed
, где rph = pressed
означает, что мое значение pressed
.
Эта ссылка содержит некоторую полезную информацию в отношении ссылок, указателей и разыменований.
Надеюсь это поможет:)
*rph = pressed
=>rph = pressed
(потерять звезду).