5

不久前我开始使用 OpenGL,使用 GLUT。您不能将成员函数传递给 GLUT 函数。(或就此问题指向成员的指针,尽管我并没有真正探索该选项)。

我想知道是否有一种“体面”的方式,或者解决这个问题的“最体面”的方式是什么?我知道你可以使用静态成员函数,但没有更好的方法吗?

我知道还有其他库,例如 SFML,它们是用 C++ 编写的并提供基于 C++ 类的接口,但我想知道关于 GLUT 的可能性(确切地说是 freeglut)。

4

2 回答 2

9

首先,GLUT 不适用于严肃的应用程序工作。它用于简单的图形演示。为此目的,这很好。如果你发现自己正试图在 GLUT 中做认真的工作,你会发现自己花了很多时间来解决它的局限性。此限制只是您最终会遇到的众多限制之一。GLFW,虽然仍然有这个限制(虽然下一个版本不会),但对于严肃的应用程序工作来说通常是优越的。

其次,解决这个问题的“最体面”的方法取决于你在做什么。如果您只有一个窗口,那么正确的解决方案只是一个简单的静态函数,它可以将全局指针(或返回全局指针的函数)指向您感兴趣的任何类。

如果您有多个窗口,那么您需要的是一个std::map从 GLUT 的窗口标识符映射到指向某个对象的指针的全局变量。然后,您可以获取从哪个窗口调用特定函数,并使用映射将该调用转发到表示该窗口的特定对象。

于 2011-08-26T23:30:47.207 回答
0

将成员函数传递给 glut 或任何其他库非常简单。GLUT 正在寻找一个函数指针。

让 Controller 成为一个具有我们想要发送到 glutKeyboardFunc 的成员函数 OnKeyPress 的类。你可能首先想尝试类似的东西

glutKeyboardFunc(&Controller::OnKeyPress);

在这里,我们传递了一个函数指针,但这是不正确的,因为您想发送该类对象的成员函数。在 C++11 中,您可以使用新的std::bind,或者如果您使用的是较旧的编译器,我建议您使用boost::bind。无论哪种方式,语法都差不多。

using namespace std::placeholders; // for the _1, _2 placeholders
glutKeyboardFunc(std::bind(&Controller::OnKeyPress, &GLInput, _1, _2, _3));

从文档看来 glutKeyboardFunc 需要 3 个参数。首先,我们修复对象的第一个参数内存地址,因为它是一个成员函数,然后提供 3 个占位符。

对于那些刚接触 std::bind 的人来说,这感觉很奇怪,但对于那些用 C 编写过面向对象代码的人来说,这很明显。该函数实际上只是一个 C 函数,并且需要指向该类的“this”指针。如果回调是一个简单的函数,则不需要绑定。

于 2016-01-21T21:56:51.557 回答