Мое приложение — это графическое приложение, написанное на C ++ с использованием OpenGL. Мне нужно использовать некоторые библиотеки, такие как GLFW, GLEW и GLM. Но вам не нужно знать об этих библиотеках или OpenGL, чтобы ответить на этот вопрос. Дело в том, что все эти библиотеки написаны на C, поэтому объектная ориентация отсутствует.
Я столкнулся с проблемами из-за этого несколько раз. Например, в настоящее время я должен передать функцию, особенно для события resize моего окна, в качестве параметра для GLEW. Он ожидает статическую функцию, потому что в C. нет классов, и обнаруживает проблему, заключающуюся в том, что я не могу изменить ни одного члена класса в этой функции. (И я не мог справиться с этим, чтобы обеспечить глобальный указатель на этот класс …)
Из-за того, что я хочу оставаться объектно-ориентированным, мне пришлось несколько раз реструктурировать свой код. И мне сейчас об этом грустно.
Так есть ли какие-либо подходы или рекомендации для обработки таких объектно-ориентированных проектов с использованием библиотек без объектно-ориентированной поддержки?
Много раз библиотека 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;
}
Других решений пока нет …