我正在C++中为一个简单的问题域设置模拟器。基础机制是在一个类MountainCar.cpp中编写的,该类将对在另一个名为MCViewer.cpp的类中实现的GUI的引用作为成员存储。我对GLUT有很好的了解,所以我想而已,而不是摸索其他替代品,而是可以使用GLUT创建应该是简单的GUI的东西。问题是我可能一次运行多个仿真,并且我希望每个实例都有自己的GUI。这可能是常识,但是GLUT是C API,我需要的某些调用(例如glutDisplayFunc和glutReshapeFunc)需要将指向C函数的指针作为参数。同时,我需要传递函数的行为以依赖于任意的MCViewer对象实例。

我发现了一个有用的thread here on 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对象应该存储对其分配的GUI的引用。在使全局函数静态化并标记全局变量currRef extern之前,我最初在链接期间遇到“重复”错误。现在,我得到了一个奇怪的错误,表明从MCViewer.o和MountainCar.o都引用了currRef。

最佳答案

如果您只是在做UI东西而没有原始图纸,也许Qt会更适合您?

http://qt.nokia.com/

07-24 21:36