0

我有我的 main 和 im 设置输入,但我使用 getter/setter 也使用从 InputHander 到我的 main 的方法,但这样做会导致堆栈溢出,因为只有一个无限循环正在进行。

我得到的警告:

warning C4717: 'key_callback' : recursive on all control paths, function will cause runtime stack overflow

除了使用 getter 和 setter 之外,我不知道如何调用此方法

主文件

#include <glfw3.h>
#include <stdio.h>
#include <iostream>

#include "InputHandler.h"

using namespace std;

/* Begin Void prototyping */
void error_callback(int error, const char* description);
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods);

int main(void)
{
    GLFWwindow* window;

    /* Initializes error call-backs */
    glfwSetErrorCallback(error_callback);

    /* Initialize the library */
    if (!glfwInit())
        return -1;

    /* Create a windowed mode window and its OpenGL context */
    window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL); // fullscreen glfwGetPrimaryMonitor() (first NULL)
    if (!window)
    {
        glfwTerminate();
        return -1;
    }

    /* Makes OpenGL context current */
    glfwMakeContextCurrent(window);

    /* Make the window's context current */
    glfwMakeContextCurrent(window);

    /* Receives input events */
    glfwSetKeyCallback(window, key_callback);

    /* Loop until the user closes the window */
    while (!glfwWindowShouldClose(window))
    {
        /* Render here */
        float ratio;
        int width, height;

        glfwGetFramebufferSize(window, &width, &height);
        ratio = width / (float) height;

        glViewport(0, 0, width, height);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glEnable(GL_DEPTH_TEST);
        glDepthFunc(GL_LEQUAL);

        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(-ratio, ratio, -1.f, 1.f, 1.f, -1.f);
        glMatrixMode(GL_MODELVIEW);

        glLoadIdentity();
        glRotatef((float) glfwGetTime() * 10.f, 0.f, 10.f, 0.f);

        /* Swap front and back buffers */
        glfwSwapBuffers(window); 

        /* Poll for and process events */
        glfwPollEvents();
    }

    glfwDestroyWindow(window);

    glfwTerminate();
    return 0;
}

/*
Calls back the program if a GLFW function fail and logs it
*/
void error_callback(int error, const char* description)
{
    fputs(description, stderr);
}

/*
    Gets InputHandler::key_callback returns key_callback too use in Main.cpp
*/
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    return key_callback(window, key, scancode, action, mods);
}

输入处理程序.h

#pragma once

#include <glfw3.h>
#include <iostream>

using namespace std;

class InputHandler
{
public:
    InputHandler(void);
    ~InputHandler(void);

    static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods);
};

输入处理程序.cpp

#include "InputHandler.h"

GLFWwindow* window;

InputHandler::InputHandler(void)
{
}


InputHandler::~InputHandler(void)
{
}

/* Gives keys events */
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    switch(key)
    {
    case GLFW_KEY_ESCAPE:
        glfwSetWindowShouldClose(window, GL_TRUE);
        break;
    case GLFW_KEY_W:
        cout << "W working" << endl;
        break;
    case GLFW_KEY_A:
        break;
    case GLFW_KEY_S:
        break;
    case GLFW_KEY_D:
        break;
    case GLFW_KEY_1:
        break;
    case GLFW_KEY_2:
        break;
    }
}
4

2 回答 2

3

如错误消息所述,此功能:

void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    return key_callback(window, key, scancode, action, mods);
}

呼唤自己,进入一个递归的死亡螺旋。大概,你的意思是

return InputHandler::key_callback(window, key, scancode, action, mods);

更简单的,去掉非成员函数,直接设置真正的回调:

glfwSetKeyCallback(window, &InputHandler::key_callback);

您还需要修复静态成员的定义:

/*no static here*/ 
void InputHandler::key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) 
{//  ^^^^^^^^^^^^^^
     // whatever
}
于 2013-08-23T16:34:43.790 回答
3

我想你是想写

/* Gives keys events */
static void InputHandler::key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{

/*
    Gets InputHandler::key_callback returns key_callback too use in Main.cpp
*/
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    return InputHandler::key_callback(window, key, scancode, action, mods);
}

但是,您需要在某处传递一些InputHandler实例,否则使用类是毫无意义的。

于 2013-08-23T16:31:44.260 回答