Функционален указател като параметър

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

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, преди да потърся в Google този въпрос).   -  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 за използване на предпочитания от мен синтаксис за дерефериране на указател на функция (предпочитам disconnectFunc() пред (*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-function-pointers 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

Трябва да декларирате disconnectFunc като функционален указател, а не празен указател. Трябва също да го извикате като функция (със скоби) и не е необходим "*".

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