Требуется помощь в использовании указателя на функцию в C ++ - PullRequest
1 голос
/ 22 марта 2011

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

typedef void (*callbackptr)(int,int);

class Myfirst
{
public:
    Myfirst();
    ~Myfirst();

    void add(int i,callbackptr ptr)
    {
        ptr(i,3);
    }

};

class Mysec
{
public:
    Myfirst first_ptr;
    Mysec();
    ~Mysec();

    void TestCallback()
    {

        callbackptr pass_ptr = NULL;
        pass_ptr = &Mysec::Testing;
        first_ptr.add(2,&Mysec::Testing);
    }

    void Testing(int a,int b)
    {
      int c = a+b;
    }

};

Ответы [ 3 ]

4 голосов
/ 22 марта 2011

Тип функции обратного вызова, которую вы передаете в качестве параметра, не определен как часть класса.Вы, вероятно, должны определить Testing как static.

3 голосов
/ 22 марта 2011

Вы получаете ошибку, потому что вы указываете на функцию-член.Указатели на функции-члены разные.Смотрите здесь: http://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.1

Функция-член должна знать, с каким экземпляром она работает (указатель this), чтобы ее нельзя было вызывать, как любую другую функцию.Если вы переместили функцию обратного вызова из класса (или сделали ее статичной, что аналогично перемещению ее из класса), вы можете вызывать ее, как и любую другую функцию.

Более современный способ сделать этоиспользовать функторы, например, boost :: function и что-то вроде boost :: bind:

C ++ Functors - и их использование

как boost :: function иboost :: bind work

Они могут скрыть разницу между функциями-членами и глобальными функциями.

0 голосов
/ 22 марта 2011

Вы пытаетесь получить доступ к указателю на функцию-член здесь, используя простой указатель функции typedef, который не будет работать. Позволь мне объяснить.

Когда вы пишете обычную функцию, не являющуюся членом (аналогично C), код функции фактически существует в месте, указанном именем функции, которое вы передаете параметру указателя функции.

Однако в случае функции-члена у вас есть только определение класса; у вас еще нет фактического экземпляра класса, выделенного в памяти. В такой функции, поскольку указатель

this
еще не определен, любая ссылка на переменные-члены не будет иметь смысла, так как у компилятора недостаточно информации для разрешения их областей памяти. На самом деле указатели на функции-члены не являются точными адресами; они кодируют больше информации, чем та (которая может быть не видна вам). Подробнее читайте Указатели на функции-члены .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...