Почему функции обратного вызова должны быть статичными при объявлении в классе

Я пытался объявить функцию обратного вызова в классе, и затем где-нибудь я читал, функция должна быть статичной, но Это не объяснило почему?

#include <iostream>
using std::cout;
using std::endl;

class Test
{
public:
    Test() {}

    void my_func(void (*f)())
    {
        cout << "In My Function" << endl;
        f(); //Invoke callback function
    }

    static void callback_func()
    {cout << "In Callback function" << endl;}
};

int main()
{
    Test Obj;
    Obj.my_func(Obj.callback_func);
}
16
задан cpx 8 March 2010 в 10:55
поделиться

6 ответов

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

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

Взгляните на std :: function (или std :: tr1 :: function или boost :: function, если ваш компилятор еще не предоставляет его), это полезно в вашем случае, поскольку позволяет вам использовать все, что callable (обеспечивающий () синтаксис или оператор) в качестве обратного вызова, включая вызываемые объекты и функции-члены (см. std :: bind или boost :: bind для этого случая).

20
ответ дан 30 November 2019 в 16:36
поделиться

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

3
ответ дан 30 November 2019 в 16:36
поделиться

Нестатические методы требуют наличия экземпляра 'this' и могут быть вызваны только для экземпляра объекта.

Однако можно использовать нестатические обратные вызовы, но их синтаксически гораздо сложнее написать. См. http://www.newty.de/fpt/callback.html#member для объяснения.

4
ответ дан 30 November 2019 в 16:36
поделиться

Маршал Клайн дает полный ответ здесь. . Весь раздел содержит все, что вам нужно знать.

Вкратце он объясняет, что вам нужен статический член, потому что указатель this не нужен (в отличие от обычных методов-членов). Но здесь также говорится о том, что использование static может быть недостаточно для всех компиляторов, так как соглашение о вызове C++ может отличаться между C и C++.

Поэтому рекомендуется использовать extern "C" нечленную функцию.

3
ответ дан 30 November 2019 в 16:36
поделиться

Если вы используете указатели функций, среда выполнения не может передать ссылку на экземпляр при вызове функции. Но вы можете использовать std::mem_fun<>, в для использования функторов и методов-членов.

0
ответ дан 30 November 2019 в 16:36
поделиться

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

8
ответ дан 30 November 2019 в 16:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: