0

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

小部件按钮.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()
{

}
4

1 回答 1

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;
于 2013-07-12T05:19:20.550 回答