方法的签名必须是什么才能与 glutDisplayFunc() 一起使用?

What does the signature of a method have to be to work with glutDisplayFunc()?

所以,我最初尝试用 C++ 做一些基本的 OpenGL (freeglut) 东西,但我遇到了障碍。我收到以下错误:

.../TextureMapper.cpp: In member function 'void TextureMapper::run()':
.../TextureMapper.cpp:67:28: error: cannot convert 'TextureMapper::display' from type 'void* (TextureMapper::)()' to type 'void (*)()'  
        glutDisplayFunc(display);
                              ^    

我认为我需要 display 成为一个函数指针(或者不管它叫什么,我对这个概念不是很熟悉)。但是,我做错了。我以前从未使用过函数指针,不幸的是,错误消息对我来说毫无意义,而且我无法理解我所阅读的文档。我是一名 Java 程序员,所以这一切对我来说都很陌生。

这里是TextureMapper.h中成员函数的声明:

void* display(void);

以及TextureMapper.cpp中的实例化(也不记得这叫什么):

void* TextureMapper::display(void)
{
    ...
}

我注意到 CLion 给我警告了这种类型,但我也先尝试了这个:

void display();

但是报了类似的错误。

这里是我尝试调用的地方 glutDisplayFunc:

void TextureMapper::run()
{
    /* Run GL */
    glutDisplayFunc(display);
    glutMainLoop();
}

glutDisplayFunc 需要一个 C 函数指针。该指针不能来自非静态成员函数,因为在 C++ 中,成员函数会被破坏。

因此,为了能够完成这项工作,一种解决方案是将 TextureMapper::Display 定义为静态成员函数。

所以,尝试这样的事情:

class TextureMapper
{
public:
    static void display(void);
    ....
};

并在 texturemapper.cpp

void TextureMapper::display(void) { \* implementation here *\}