c – 指向一个类成员的函数–glfw setKeycallback

我正在编写一个glfw应用程序,我将函数调用函数包装到一个简单的类中.我在设置密钥回调时遇到问题.
我的课程定义为:

class GAME 
{
private:
    bool running;
public:
    GAME();
    int execute();
    void events(int, int);
    int loop();
    int render();
};

执行功能是:

int GAME::execute() 
    {
        glfwOpenWindow(640, 320, 8, 8, 8, 8, 0, 0, GLFW_WINDOW);
        glfwSetWindowTitle("Viraj");
        glfwSetKeyCallback(events);
        running = true;
        while(glfwGetWindowParam(GLFW_OPENED))
        {
            glfwPollEvents();
            loop();
            render();
        }
        return 0;
    }

在Visual Studio 2010上编译以下代码,给出错误:

错误C3867:’GAME :: events’:函数调用缺少参数列表;使用’& GAME :: events’创建指向成员的指针

使用& GAME :: events提供:

错误C2664:’glfwSetKeyCallback’:无法将参数1从’void(__ thishisall GAME :: *)(int,int)’转换为’GLFWkeyfun’
1 GT;没有可以进行此转换的上下文

解决方法:

有一种用于指向类成员方法的C语法,但您无法将它们传递给C样式API. C理解函数调用和每个非静态对象方法,以事件为例,用C语言看起来像这样思考:void events(void * this,int,int);意味着除了标准参数之外的每个方法都会以静默方式传递此指针.

要使事件C兼容,请使其成为静态void事件(int,int);.这样它将遵循C调用语义 – 它不需要传递这个指针.您还必须以某种其他方式将对象传递给此回调(如果在回调中需要此对象的数据).

上一篇:OpenGL 开发环境配置(Windows) - Visual Studio 2017 + GLFW + GLAD 详细图文教程


下一篇:在OS X上安装pyglfw