Я настраиваю симулятор в C ++ для простой проблемной области.Основная механика написана в одном классе MountainCar.cpp, который хранит в качестве члена ссылку на графический интерфейс, который реализован в другом классе с именем MCViewer.cpp.Я имел приличное знакомство с GLUT, поэтому я решил вместо того, чтобы возиться с альтернативами, я мог бы просто создать то, что должно быть простым GUI, используя GLUT.Проблема в том, что у меня может быть запущено более одного моделирования одновременно, и я хочу, чтобы у каждого экземпляра был свой графический интерфейс.Это может быть общеизвестно, но GLUT - это C API, и определенные вызовы, которые мне нужны, такие как glutDisplayFunc и glutReshapeFunc, требуют указателей на функции C в качестве аргументов.Между тем мне нужно, чтобы поведение передаваемых функций зависело от некоторого произвольного экземпляра объекта MCViewer.
Я нашел здесь полезный поток в stackoverflow , который предлагал создавать и вместо этого передавать глобальные функции обратного вызова,при реализации соответствующих функций вызываемого абонента внутри класса MCViewer.Поскольку функции обратного вызова являются глобальными, но намереваются работать с некоторым указанным экземпляром объекта, необходима другая глобальная переменная, которая хранит ссылку на некоторый текущий объект MCViewer.
Результирующий заголовок:
#ifndef MCVIEWER_H__
#define MCVIEWER_H__
#include <cstdlib>
#include <ctime>
#include <stdlib.h>
#include <string>
#include <math.h>
#include <iostream>
#include <assert.h>
#include <GLUT/GLUT.h>
class MCViewer {
//MCViewer declarations, implementation specified in corresponding .cpp
};
extern MCViewer *currRef;
extern "C" {
static void displayFcnCB(void) {
currRef->displayFcn();
}
static void winReshapeFcnCB(GLint newWidth, GLint newHeight) {
currRef->winReshapeFcn(newWidth, newHeight);
}
static void keyboardActionCB(GLubyte key, GLint xMouse, GLint yMouse) {
currRef->keyboardAction(key, xMouse, yMouse);
}
}
#endif //MCVIEWER_H__
Проблема связана с включением этого файла в файлы MCViewer.cpp и MountainCar.h.Напомним, объект MountainCar, по моему замыслу, должен хранить ссылку на назначенный ему графический интерфейс.До того, как я сделал глобальные функции статичными и пометил глобальную переменную currRef extern, я изначально получал «дублирующие» ошибки во время компоновки.Теперь я получаю странную ошибку, которая говорит о том, что на currRef ссылаются как из MCViewer.o, так и из MountainCar.o.