void**不能用作函数
void** cannot be used as a function
编译此代码时出错。错误显示'&((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;
相关文章:
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 为什么虚函数不能是静态的和全局的?
- 为什么继承的受保护构造函数不能公开?
- C++为什么类成员函数不能重新声明,但普通函数可以
- 为什么在C++中使用关系运算符创建的模板函数不能对字符串正常工作?
- 成员函数不能为集合迭代器和const_iterator的输入重载(但可以为其他 STL 迭代器重载)
- 为什么模板函数不能作为模板模板参数传递?
- 为什么 free 函数不能在 C 数组上运行,而 std::begin 在某些情况下可以在 C++14 中运行?
- 构造函数不能用于启发性化
- C 错误 - 函数不能超载
- 有没有办法使成员函数不能从构造函数调用
- 为什么模板函数不能是模板类的友元模板函数
- "Framework::Graphics::Material"的默认构造函数不能被引用 - 它是一个已删除的函数
- lower_bound()函数不能在调试模式下编译
- 为什么函数不能正确强制转换指针(从基类到派生类)
- 显式默认函数不能声明为 constexpr,因为隐式声明不是 constexpr
- 琐碎的默认构造函数不能是 constexpr?
- 函数不能嵌套,那么如何在C++中执行此操作
- 错误:成员函数不能在其类之外声明
- 错误-仅返回类型不同的函数不能重载.c++