Как вызвать функцию, используя указатель на член-функцию - PullRequest
2 голосов
/ 07 марта 2011

У меня есть класс:

class A {
    void test_func_0(int);
    void run();

    typedef void(A::*test_func_t)(int);

    struct test_case_t{
       test_func_t test_func;
    } test_case[100];
};

Теперь я хочу вызвать test_func () внутри run ():

void A::run() 
{
    test_case[0].test_func = &test_func_0;
    test_case[0].*(test_func)(1);
}

Последняя строка моего кода не работает(ошибка компиляции), независимо от того, какую комбинацию я пробую.

Ответы [ 3 ]

5 голосов
/ 07 марта 2011

Используйте это:

void A::run() 
{   
    test_case[0].test_func = &A::test_func_0;
    (this->*(test_case[0].test_func))(1);
}

Обратите внимание, что у вас было 2 ошибки. Первым было то, как вы сформировали указатель на функцию-член. Обратите внимание, что единственный способ сделать это - использовать &ClassName::FuncName независимо от того, находитесь ли вы в области видимости класса или нет. И тоже обязательно.

Во-вторых, когда вы вызываете член с помощью указателя на функцию-член, вы должны явно указать объект (типа A в вашем случае), для которого вызывается функция-член. В этом случае вы должны указать this (и поскольку это указатель, мы используем ->* вместо .*)

НТН

1 голос
/ 07 марта 2011

Использование:

(this->*test_case[0].test_func)(1);
0 голосов
/ 07 марта 2011

Вызов функции-члена с использованием указателя на функцию-члена:

 test_case[0].test_func = &A::test_func_0; //note this also!
(this->*test_case[0].test_func)(1);

Демо: http://www.ideone.com/9o8C4

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