当前位置: 首页 > 知识库问答 >
问题:

作为函数指针传入C++方法?

苗康平
2023-03-14

我创建了一个名为InputControl的类。我正在使用一个名为GLFW的库和一个函数glfwsetkeycallback。该函数定义为:

#pragma once
#include <GLFW/glfw3.h>
#include "config.h"

class InputControl {
public:
    void bind();
    void unbind();

private:
     void __glfw__keycallback_bind(GLFWwindow* window, int key, int scancode, int action, int mods);
};
void InputControl::bind() {
    glfwSetKeyCallback(__application__window, __glfw__keycallback_bind);
}

void InputControl::unbind() {

}

void InputControl::__glfw__keycallback_bind(GLFWwindow * window, int key, int scancode, int action, int mods) {
//... other code here
}

E0167“void(inputcontrol::*)(GLFWwindow*window,int key,int scancode,int action,int mods)”类型的参数与“GLFWKeyFun”类型的参数不兼容

共有1个答案

萧懿轩
2023-03-14

非静态成员函数需要一个对象来处理。您需要一个非成员函数或静态成员函数作为回调函数。如果绝对需要在回调中访问InputControl类的实例,可以使用glfwsetWindowUserPointer()设置窗口的用户指针,然后回调可以使用该指针调用非静态成员函数:

class InputControl {
public:
    void bind();
    void unbind();

private:
     static void keyCallbackStatic(GLFWwindow* window,
                                   int key,
                                   int scancode,
                                   int action,
                                   int mods);
     void keyCallback(GLFWwindow* window,
                      int key,
                      int scancode,
                      int action,
                      int mods);
};

void InputControl::bind() {
    glfwSetWindowUserPointer(applicationWindow, this);
    glfwSetKeyCallback(applicationWindow, keyCallbackStatic);
}

void InputControl::keyCallbackStatic(GLFWwindow* window,
                                     int key,
                                     int scancode,
                                     int action,
                                     int mods)
{
    InputControl* that = static_cast<InputControl*>(glfwGetWindowUserPointer(window));
    that->keyCallback(window, key, scancode, action, mods);
}

void InputControl::keyCallback(GLFWwindow* window,
                               int key,
                               int scancode,
                               int action,
                               int mods)
{
    // Do whatever
}

您可以确保InputControl对象的活动时间与窗口的活动时间一样长,并且除了InputControl对象指针之外,没有其他任何东西可以将窗口的用户指针设置为任何指针。

 类似资料:
  • 当我构建这个应用程序时,我得到错误: 我也试过: 这将错误更改为: 下面是调用这个例程的类和我传递的回调函数的示例:

  • C++ 指针 C++ 允许您传递指针给函数,只需要简单地声明函数参数为指针类型即可。 下面的实例中,我们传递一个无符号的 long 型指针给函数,并在函数内改变这个值: #include <iostream> #include <ctime> using namespace std; void getSeconds(unsigned long *par); int main () {

  • 我正在尝试编写一个类模板,在内部它使用一个函数(BFGS优化的实现,由环境提供),接口如下: 其中< code>fn和< code>gr是类型的函数指针 和 分别是。我的< code>C 类模板如下所示: 这样,它可以由任何具有两个指定成员函数的类进行实例化,例如: 这可能吗?或者也许有更好的方法来做到这一点 - 将两个成员函数分别作为函数指针传递?(如果目标函数和相应的梯度很简单,那么编写两个函

  • 问题内容: 我有以下功能: 其中,的类型是具有以下定义的接口: 题: 这是真的,和是 通过按引用 ,并且有它的价值被复制? 我认为: 是通过引用的,因为它是一张地图 是一个结构。因此,我应该传递指针以避免复制数据 问题答案: 接口类型只是一组方法。请注意,接口定义的成员未指定接收方类型是否为指针。这是因为 值类型的方法集是其关联的指针类型的方法集的子集 。满嘴 我的意思是,如果您具有以下条件: 然

  • 我的问题是,我想创建一个通用的命令行应用程序,可以用来加载一个库DLL,然后调用库DLL中的函数。函数名在命令行中指定,参数也在实用程序命令行中提供。 我可以使用函数从动态加载的DLL访问外部函数。加载库后,我可以使用获得指向函数的指针。我想用命令行上指定的参数调用函数。 我是否可以将空点指针列表传递给 函数返回的函数指针,类似于下面的示例? 为了保持示例代码简单,我删除了错误检查。有没有办法让这

  • C语言允许函数的返回值是一个 指针(地址),我们将这样的函数称为 指针函数。下面的例子定义了一个函数 strlong(),用来返回两个字符串中较长的一个: 运行结果: C Language↙ c.biancheng.net↙ Longer string: c.biancheng.net 用指针作为函数返回值时需要注意的一点是,函数运行结束后会销毁在它内部定义的所有局部数据,包括局部变量、局部数组和