Использование указателей на функции? - PullRequest
2 голосов
/ 01 октября 2010

Я еще не очень знаком с ними, но, возможно, кто-то может пролить свет на этот пример.

Представьте, что у меня есть класс CFoo, и он будет иметь функцию для добавления обработчика и функцию, которая является указателем на функцию.

Так что-то вроде этого:

class CFoo {

int *pointedFunc(int a, int b) = 0;

void setFunc(int *func(int a, int b))
{
    pointedFunc = func;
}
};

Учитывая вышеизложенный контекст, я хочу знать, как это сделать. Я не думаю, что сделал это правильно. Кроме того, как мне поступить с вызовом PointFunc?

Спасибо

Ответы [ 2 ]

8 голосов
/ 01 октября 2010

Прямо сейчас у вас есть функция-член, возвращающая int *, а не указатель на функцию, возвращающую int.Набор скобок исправит это.

int (*pointedFunc)(int a, int b);

void setFunc(int (*pfunc)(int a, int b))
{
    pointedFunc = pfunc;
}

Кроме того, переменные-члены инициализируются в конструкторе ctor-initializer-list , например

CFoo::CFoo() : pointedFunc(0) {}

не такты сделал.Ваш = 0 был на самом деле чисто спецификатором (и он не будет работать, если функция-член не является виртуальной), когда вы исправите проблему типа указатель-возврат против указателя на функцию, вы обнаружите, что компилятор также жалуетсяо вашей попытке его инициализации.

Использование typedef, как предполагает Грэм, - самый простой и лучший способ отслеживать типы указателей на функции.

3 голосов
/ 01 октября 2010

В вашем примере pointedFunc - это функция-член, которая возвращает int *.Чтобы сделать его указателем на функцию, вам нужно иметь символы около pointedFunc, например:

int (*pointedFunc)( int a, int b );

Функция typedef может сделать это более понятным:

class CFoo {
    CFoo() : pointedFunc( NULL ) {}
    typedef int (*funcType)(int, int);
    funcType pointedFunc;

    void setFunc( funcType f ) {
         pointedFunc = f;
    }
};

Чтобы вызвать функцию, вы можете использоватьлибо pointedFunc( 1, 2 ), либо (*pointedFunc)(1, 2).Я склонен использовать последний, чтобы прояснить, что вы проходите через указатель на функцию, но любой из них будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...