Подходы для объектно-ориентированного приложения с использованием библиотек C

Мое приложение — это графическое приложение, написанное на C ++ с использованием OpenGL. Мне нужно использовать некоторые библиотеки, такие как GLFW, GLEW и GLM. Но вам не нужно знать об этих библиотеках или OpenGL, чтобы ответить на этот вопрос. Дело в том, что все эти библиотеки написаны на C, поэтому объектная ориентация отсутствует.

Я столкнулся с проблемами из-за этого несколько раз. Например, в настоящее время я должен передать функцию, особенно для события resize моего окна, в качестве параметра для GLEW. Он ожидает статическую функцию, потому что в C. нет классов, и обнаруживает проблему, заключающуюся в том, что я не могу изменить ни одного члена класса в этой функции. (И я не мог справиться с этим, чтобы обеспечить глобальный указатель на этот класс …)

Из-за того, что я хочу оставаться объектно-ориентированным, мне пришлось несколько раз реструктурировать свой код. И мне сейчас об этом грустно.

Так есть ли какие-либо подходы или рекомендации для обработки таких объектно-ориентированных проектов с использованием библиотек без объектно-ориентированной поддержки?

0

Решение

Много раз библиотека 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;
}
1

Другие решения

Других решений пока нет …