Я получаю сообщение об ошибке при компиляции этого кода. Ошибка говорит '&((WidgetButton*)this)->WidgetButton::callback' cannot be used as a function
. Я не знаю почему. Что я сделал не так?void ** не может использоваться как функция
Объяснение немного больше. Цель этого кода - добавить кнопку в GUI в виде ООП. callback
- это функция, предоставляемая конструктору, который будет вызываться, когда кнопка активирована (нажата). Хотя сейчас он активируется только при нажатии пробела, с тем чтобы убедиться, что графический интерфейс работает с производными классами 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()
{
}
Указатели - это не то же самое, что указатели на функции, и вы должны действительно использовать что-то лучше, чем 'void *' в C++. 'void *' не следует использовать для хранения указателей на функции. – chris
Ну, как я могу определить указатель на функцию? Мне кажется, что
void**
- это то же самое, что и указатель на функцию. –Прежде всего, вы можете встроить код с обратными окнами. Во-вторых, нормально ли иметь одну конкретную подпись обратного вызова? Если это так, нормальный указатель функции достаточно хорош: 'void (* callback) (int)' – chris