Как получить указатель на функцию класса для нестатической функции из функции другого класса? - PullRequest
0 голосов
/ 24 апреля 2011

Мне нужно передать функцию класса в качестве аргумента для glutIdleFunc. Эта конструкция не работает:

void (*func)(void) = this->step();
glutIdleFunc(func);

и это тоже:

void (*func)(void) = Core::step();
glutIdleFunc(func);

Как я могу это сделать? Извините за мою глупость ...:)

Ответы [ 4 ]

5 голосов
/ 24 апреля 2011

В C ++ обратные вызовы, такие как принятые glutIdleFunc () , должны быть статическими методами. Попробуйте:

class Core
{
public:
    static void step()
    {
        // ...
    }
};

glutIdleFunc(Core::step);
1 голос
/ 24 апреля 2011

glutIdleFunc просто не поддерживает вызов нестатической функции-члена.Если вы хотите, чтобы свободный цикл вызывал метод объекта, вам нужно поместить указатель на объект в глобальную переменную и иметь регулярную функцию или статический член, который вызывает ваш метод step для этого глобального объекта.1003 *

Есть два способа сделать это.Более простой способ:

// global scope
Core *foo = NULL;
void myIdleCallback()
{
    foo->step();
}

// when initializing, in main or whatever
{
    // ...
    foo = &theThingIWantToCall;
    glutIdleFunc(&myIdleCallback);
    // ...
}

Или, для немного большей инкапсуляции:

// work these into your Core declaration
class Core {
    static class Core* foo;
    static void myIdleCallback() {
        foo->step();
    }
};

// at global scope
Core *Core::foo = NULL;

// at initialization time
{
    // ...
    Core::foo = &theThingIWantToCall;
    // or if foo is private, add a static method to set it and call that
    glutIdleFunc(&Core::myIdleCallback);
    // ...
}
0 голосов
/ 17 октября 2012

Я думаю, что проблема в этой строке: void (* func) (void) = Core :: step ();

Смотрите, вы описываете сигнатуру функции как void (* func) (void), этоявляется сигнатурой функции C, а не метода c ++.Все нестатические методы-члены в c ++ похожи на функции c, но кроме того имеют скрытый параметр, который является указателем на this.

Попробуйте изменить сигнатуру на void (Core :: * func) (void) = Core :: step ();

Вы можете вызвать экземпляр объекта с помощью: Core test;(test. * test.func) ();

«f.test» возвращает указатель на метод, а оператор «. *» вызывает функцию указателя на член класса

0 голосов
/ 24 апреля 2011

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

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