编译此代码时出错。错误说'&((WidgetButton*)this)->WidgetButton::callback' cannot be used as a function
。我不知道为什么。我做错了什么?
解释一下。此代码的目的是能够以OOP方式将按钮添加到GUI中。 callback
是赋予构造函数的函数,当按钮被激活(单击)时将调用该函数。虽然现在它只在你按空格时激活,以确保GUI与Widget
派生类一起工作。
WidgetButton.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()
{
}
答案 0 :(得分:0)
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;