C++ 如何获得课程';来自另一个类的非静态函数的函数指针';s函数?

C++ 如何获得课程';来自另一个类的非静态函数的函数指针';s函数?,c++,class,function-pointers,C++,Class,Function Pointers,我需要传递类函数作为glutIdleFunc的参数。这种构造不起作用: void (*func)(void) = this->step(); glutIdleFunc(func); 这也是: void (*func)(void) = Core::step(); glutIdleFunc(func); 我怎么做? 对不起我的愚蠢…:)

我需要传递类函数作为glutIdleFunc的参数。这种构造不起作用:

void (*func)(void) = this->step();
glutIdleFunc(func);
这也是:

void (*func)(void) = Core::step();
glutIdleFunc(func);
我怎么做?
对不起我的愚蠢…:)
class Core
{
public:
    static void step()
    {
        // ...
    }
};

glutIdleFunc(Core::step);

在C++中,回调函数(如所接受的回调)必须是静态方法。尝试:

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

glutIdleFunc(Core::step);

类的成员函数有一个名为this的隐藏参数,该参数是指向其调用对象的指针。因此,当您尝试将其用作回调时,函数签名将不匹配,您应该使用没有隐藏this参数的静态函数。

类的成员函数有一个名为this的隐藏参数,该参数是指向其调用对象的指针。因此,当您尝试将其用作回调函数时,函数签名将不匹配,您应该使用没有隐藏此参数的静态函数。

glutIdleFunc
根本不支持调用非静态成员函数。如果希望空闲循环调用对象的方法,则需要在全局变量中放置一个指向该对象的指针,并使用一个常规函数或静态成员来调用该全局对象上的
步骤
方法

有两种方法可以让你做到这一点。更简单的方法是:

// 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);
    // ...
}

glutIdleFunc
不支持调用非静态成员函数。如果希望空闲循环调用对象的方法,则需要在全局变量中放置一个指向该对象的指针,并使用一个常规函数或静态成员来调用该全局对象上的
步骤
方法

有两种方法可以让你做到这一点。更简单的方法是:

// 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);
    // ...
}

我认为问题在于这一行: void(*func)(void)=核心::步骤()

<>请将函数的签名描述为空隙(*FUNC)(空格),这是C函数的签名,而不是C++方法。 C++中所有非静态成员方法都类似于C函数,但另外还有一个隐藏参数,它是指向“这个”的指针。 尝试将签名更改为void(Core::*func)(void)=Core::step()

您可以使用以下命令从对象的实例调用: 岩心测试; (test.*test.func)()


“f.test”返回指向方法的指针,“*”运算符调用类上指向成员函数的指针

我认为问题在于这一行: void(*func)(void)=核心::步骤()

<>请将函数的签名描述为空隙(*FUNC)(空格),这是C函数的签名,而不是C++方法。 C++中所有非静态成员方法都类似于C函数,但另外还有一个隐藏参数,它是指向“这个”的指针。 尝试将签名更改为void(Core::*func)(void)=Core::step()

您可以使用以下命令从对象的实例调用: 岩心测试; (test.*test.func)()

“f.test”返回指向该方法的指针,“*”运算符调用类上指向成员函数的指针

FYI:您正在查找一个(通常称为lambdas),它是C++0x的一部分;请参阅以获取更多信息。仅供参考:您正在寻找一个(通常称为lambdas),它是C++0x的一部分;有关更多信息,请参阅。