如何在C++和OpenGL中将类方法作为另一个函数的参数传递?

11 c++ opengl methods glut

我知道这件事有效:

void myDisplay()
{
...
}
int main()
{
...
glutDisplayFunc(myDisplay)
...
}
Run Code Online (Sandbox Code Playgroud)

所以我试图将myDisplay()函数包含到我创建的类中.因为我希望将来用不同的类重载它.但是,编译器抱怨说

argument of type 'void (ClassBlah::)()' does not match 'void(*)()' .

这是我尝试做的:

class ClassBlah
{
   ....
   void myDisplay()
   ....
}
......
int main()
{

    ...
    ClassBlah blah
    glutDisplayFunc(blah.myDisplay)
    ...
}
Run Code Online (Sandbox Code Playgroud)

有谁知道如何解决这个问题?非常感谢.

kib*_*ibu 9

首先,在非静态成员函数中有一个隐含的"this"指针,因此您需要将void myDisplay()in 更改ClassBlah为static.解决这个限制是很尴尬的,这就是C++ faq lite说不做的原因

然后,您应该能够将函数传递给ClassBlah::myDisplay.

根据你的重载动机(即你要在运行时进出热插拔实现,还是只在编译时?)你可能会考虑一个实用程序"handler"静态类,它包含指向你的基类的指针,并通过那.


小智 5

我遇到了自己编写C++ Glut引擎的问题.这是我如何解决它:

我将它们放在program.cpp/main.cpp的顶部

// Function prototypes
void doRendering( void );
void processMouse( int, int ) ;
void processMouseClick(int button, int state, int x, int y);
void keyboardInput(unsigned char c, int x, int y);
Run Code Online (Sandbox Code Playgroud)

在这里将这些函数分配给过剩的回调:

glutDisplayFunc(doRendering);
glutIdleFunc(doRendering);
glutPassiveMotionFunc(processMouse);
glutMotionFunc(processMouse);
glutMouseFunc(processMouseClick);
glutKeyboardFunc(keyboardInput);
Run Code Online (Sandbox Code Playgroud)

创建我自己的类,它自己处理这些,然后使我们的静态函数的内容只调用这个类的实例上的方法.你的main函数应该在main中创建一个新的类实例(在我的例子中...... App*newApp).

void doRendering( void )
{
    newApp->updateScene();
    newApp->drawScene();
}

void processMouse(int x, int y)
{
    newApp->processMouse(x, y);
}

void processMouseClick(int button, int state, int x, int y)
{
    newApp->processMouseClick(button, state, x, y);
}

void keyboardInput(unsigned char c, int x, int y)
{
    newApp->keyboardInput(c, x, y);
}
Run Code Online (Sandbox Code Playgroud)

希望能够解释它.