Указатель функции как параметр

Я пытаюсь вызвать функцию, которая передается как указатель на функцию без аргумента, но я не могу заставить ее работать.

void *disconnectFunc;

void D::setDisconnectFunc(void (*func)){
    disconnectFunc = func;
}

void D::disconnected(){
    *disconnectFunc;
    connected = false;
}

person Roland Soós    schedule 06.04.2010    source источник
comment
cdecl.org может помочь.   -  person JRL    schedule 06.04.2010
comment
@JRL cdecl не помогает в этом, в частности (я пробовал cdecl, прежде чем гуглить этот вопрос).   -  person Tomáš Zato - Reinstate Monica    schedule 02.02.2016


Ответы (3)


Правильный способ сделать это:

typedef void (*callback_function)(void); // type for conciseness

callback_function disconnectFunc; // variable to store function pointer type

void D::setDisconnectFunc(callback_function pFunc)
{
    disconnectFunc = pFunc; // store
}

void D::disconnected()
{
    disconnectFunc(); // call
    connected = false;
}
person GManNickG    schedule 06.04.2010
comment
+1 за использование моего предпочтительного синтаксиса разыменования указателя на функцию (предпочитаю разъединениеFunc() вместо (*disconnectFunc)(), хотя они оба в порядке) - person Dan; 06.04.2010
comment
Это портативный способ или его не рекомендуется использовать для переносимости? - person JavaRunner; 20.07.2013
comment
@JavaRunner: это совершенно портативно. - person GManNickG; 21.07.2013
comment
Отлично. Спасибо! Вы случайно не знаете, что мне нужно исправить в этом коде, если мне нужно передать функцию в setDisconnectFunc() с некоторыми параметрами? - person JavaRunner; 22.07.2013
comment
@JavaRunner: вам следует задать новый вопрос, если вам нужна помощь в его расширении, раздел комментариев слишком ограничен. Есть много способов сделать это, какими бы ни были ваши требования. - person GManNickG; 22.07.2013
comment
Придать этому простую форму более понятным способом 1. learncpp.com/cpp -tutorial/78-указатели-функций 2. newty.de/fpt/fpt. html (также о том, как вернуть указатель на функцию) - person gihanchanuka; 20.07.2015

Замените void *disconnectFunc; на void (*disconnectFunc)();, чтобы объявить переменную типа указателя на функцию. Или, что еще лучше, используйте typedef:

typedef void (*func_t)(); // pointer to function with no args and void return
...
func_t fptr; // variable of pointer to function
...
void D::setDisconnectFunc( func_t func )
{
    fptr = func;
}

void D::disconnected()
{
    fptr();
    connected = false;
}
person Nikolai Fetissov    schedule 06.04.2010

Вам нужно объявить разъединениеFunc как указатель на функцию, а не пустой указатель. Вам также нужно вызвать его как функцию (с круглыми скобками), и «*» не требуется.

person WhirlWind    schedule 06.04.2010
comment
Спасибо. Окончательный код: void (*disconnectFunc)(); void D::setDisconnectFunc(void (*func)()){disconnectFunc = func; } void D::disconnected(){ (*disconnectFunc)(); подключен = ложь; } - person Roland Soós; 06.04.2010