我的应用程序是使用OpenGL用C ++编写的图形应用程序。我需要使用像GLFW,GLEW和GLM这样的库。 但你不需要知道这些库或OpenGL来回答这个问题。关键是所有这些库都是用C语言编写的,所以没有面向对象。
我因此多次遇到麻烦。例如,目前我必须传递一个函数,特别是我的窗口的resize事件,作为GLEW的参数。它需要一个静态函数,因为C中没有类。并且揭示了我无法修改此函数中任何类成员的问题。 (我无法处理它以提供指向该类的全局指针......)
由于我希望保持面向对象的事实,我不得不最近几次重构我的代码。我现在很伤心。
那么有没有任何方法或指导方针来处理这些面向对象的项目使用没有面向对象支持的库?
答案 0 :(得分:1)
很多时候,C库允许您传入上下文指针/引用常量,通常类型为void *
或const void *
。然后你的回调传递给这个参数。这是为了让你将状态线程连接到回调。您可以使用它来传递您想要使用的对象。
我已经通过声明一个静态成员函数,使其成为回调的目标,然后从中弹跳到一个正确的成员函数来完成此操作,例如:
/*static*/ int Class::_callback(void *ctx, int callback_arg) {
Class *me = (Class *)ctx;
return me->callback(callback_arg);
}
int Class::callback(int callback_arg) {
return this->fCount;
}