Установить указатель функции-члена на указатель свободной функции - PullRequest
1 голос
/ 05 августа 2020

Я работаю над простым движком, написанным на C ++ и обернутым ctypes. Я работаю над классом окна и хочу дать пользователю движка возможность устанавливать функции рисования и обновления. У меня есть следующий код:

window.h

#pragma once
#include <GL/glew.h>
#include <GLFW/glfw3.h>
class window
{
public:
    GLFWwindow* wnd;

    window(int width, int height, const char* title);
    void close();

    void update();
    void (window::*draw)();

    void setDrawFunction(void (window::*)());
    void setUpdateFunction(int*);
};

window. cpp

#include <GL/glew.h>
#include <GLFW/glfw3.h>

#include "window.h"

void default_draw() {
    glClear(GL_COLOR_BUFFER_BIT);
}

void default_update() {
    
}

window::window(int width, int height, const char* title)
{
    glfwWindowHint(GLFW_SAMPLES, 4);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_COMPAT_PROFILE, GL_TRUE);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    wnd = glfwCreateWindow(width, height, title, NULL, NULL);

    if (wnd == NULL) { glfwTerminate(); return; }

    glfwMakeContextCurrent(wnd);

    if (glewInit() != GLEW_OK) {
        glfwTerminate();
        return;
    }

    setDrawFunction((void)(window::*)()default_draw);
}

void window::close() {
    glfwDestroyWindow(this->wnd);
}

void window::update() {
    default_update();
}

void window::setDrawFunction(void (window::*fnptr)()) {
    draw = fnptr;
}

Это не работает. Я упускаю что-то очевидное или sh таким образом просто невозможно выполнить. Если да, могу ли я добиться этого? Все, что мне нужно, это иметь возможность перегрузить функцию, поэтому я могу сделать это в python, используя ctypes.

Ошибки, которые я получаю: выражение 109 перед вызовом должно иметь ожидаемое выражение типа функции (указателя) 29 18 ожидается ")"

1 Ответ

2 голосов
/ 05 августа 2020

Использование указателя функции-члена window в качестве переменной-члена нецелесообразно.

Я могу придумать следующие варианты решения проблемы.

Вариант 1

Сделать draw указателем на функцию, не являющуюся членом.

void (*draw)();

void setDrawFunction(void (*func)());

Вариант 2

Сделать draw a std::function

std::function<void()> draw;

void setDrawFunction(std::function<void()> func);

Вариант 3

Используйте класс / интерфейс разделителя для рисования.

std::unique_ptr<DrawingAgent> draw;

void setDrawingAgent(std::unique_ptr<DrawingAgent> agent);

где

class DrawingAgent
{
   public:
      virtual void draw(window*); // Draw in given window.
};

Из вышеперечисленных вариантов я бы рекомендовал использовать Вариант 3 . Он четко отделяет аспект окно вашего приложения от функциональности рисования .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...