C ++: указатель на функцию другого класса - PullRequest
3 голосов
/ 22 декабря 2011

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

class B {
public:
    int func(int i);
};

class A {
public:
    typedef int (B::*fPtr)(int);
    void run();
    B* mB;
};

void A::run() {
    // create a pointer
    fPtr p = &(B::func);
    // invoke the function
    mB->*p(2);     <------- Compilation Error
}

Мне нужно создать указатель на func () в функции запуска A.Я получаю ошибку компиляции, говорящую, что mB не соответствует функции с 1 аргументом.

, пожалуйста, помогите

Ответы [ 3 ]

6 голосов
/ 22 декабря 2011

Вам нужно поставить скобки вокруг выражения функции:

(mB->*p)(2);

Но, как отмечали другие, почти наверняка есть лучший способ сделать то, что вы пытаетесь сделать.

2 голосов
/ 22 декабря 2011

Методы экземпляра в классе всегда имеют скрытый первый параметр для указателя this, поэтому он несовместим с указателем вашей функции typedef. Нет прямого способа получить указатель на функцию-член. Типичным обходным решением является использование «thunk», когда вы передаете статическую функцию, которая принимает общий параметр «catch all» (такой как void *), который может быть статически приведен к указателю по вашему выбору, для которого вы можете вызвать член функция. Пример:

class B
{
public:
    static void MyThunk(void * obj)
    {
        static_cast<B *>(obj)->MyRealFunc();
    }

    void MyRealFunc()
    {
        // do something here
    }

    // . . .
};

Вы можете легко получить указатель на статическую функцию, так как она не имеет «скрытого this», просто укажите ее, используя B::MyThunk. Если вашей функции требуются дополнительные параметры, вы можете использовать что-то вроде функтора для захвата необходимых параметров и состояния.

Вам определенно следует прочитать эту страницу C ++ FAQ Lite, которая расскажет вам гораздо больше обо всем этом: Указатели на функции-члены

1 голос
/ 22 декабря 2011

почему ты не можешь позвонить mB->func(2);?

Если вам нужны разные функции для B, возможно, обратите внимание на virtual функции и наследование классов

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