void **不能用作函数

时间:2013-07-12 04:53:17

标签: c++ user-interface glfw

编译此代码时出错。错误说'&((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()
{

}

1 个答案:

答案 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;