方法的签名必须是什么才能与 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 *\}
所以,我最初尝试用 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 *\}