void**不能用作函数

void** cannot be used as a function

本文关键字:函数 不能 void      更新时间:2023-10-16

编译此代码时出错。错误显示'&((WidgetButton*)this)->WidgetButton::callback' cannot be used as a function。我不知道为什么。我做错了什么?

再解释一下。此代码的目的是能够以OOP方式将按钮添加到GUI中。callback是赋予构造函数的函数,当按钮被激活(单击)时,构造函数将被调用。尽管现在它只在您按下空格时激活,但为了确保GUI与Widget派生类一起工作。

小工具按钮.h

#pragma once
#include "cgl.h"
#include <GLFW/glfw3.h>
class WidgetButton : Widget
{
    public:
        WidgetButton(GLFWwindow* window, void* callback, int sender);
        void onUpdate(double delta);
        void onRender();
    private:
        void* callback;
        int sender;
};

WidgetButton.cpp

#pragma once
#include "WidgetButton.h"
#include <GLFW/glfw3.h>
WidgetButton::WidgetButton(GLFWwindow* window, void* callback, int sender) : Widget(window)
{
    this->callback = callback;
    this->sender = sender;
}
void WidgetButton::onUpdate(double delta)
{
    if (glfwGetKey(this->window, GLFW_KEY_SPACE))
        (&this->callback)(sender); //This is where the error happens
}
void WidgetButton::onRender()
{
}

void *是一种不同于可以容纳函数的类型。尝试将函数指针或类似的东西放入其中是不好的。C++有几个选项,如果你来自C或没有过多地处理模板,最简单的选项就是这里所需要的,函数指针:

void (*callback)(int);

接下来,也可以用一个简单的模板来做同样的事情:

template<typename F>
F callback;

接下来,还可以允许其他类型使用一些模板工作。这是最通用的方法,但可以根据您想要的通用部件进行调整:

template<typename Ret, typename... Args>
...
Ret (*callback)(Args...);

最后,C++提供了std::function,您也可以在这里使用它,但它确实最适合用于开销较大的更复杂的目的:

std::function<void(int)> callback;