-2

我有一堂课

class App {
private:
    float angle;

public:
    App();
    int OnExecute();
    void OnLoop();
    void OnRender();
    bool OnInit();
    void OnCleanup();
};

//In my cpp file:
int App::OnExecute() {
    if (OnInit() == false) {
        return -1;
    }

    OnLoop();
    OnRender();

    OnCleanup();

    return 0;
}

bool App::OnInit() {
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA );
    glutInitWindowPosition(-1,-1);
    glutInitWindowSize(1024,768);
    glutCreateWindow("D&D VT");

    glutDisplayFunc(Render); //Why can't I put this->OnRender
    //glutReshapeFunc(changeSize);
    //glutIdleFunc(Render);

    return true;
}

我评论了我正在努力做我想做的事情的那一行。我想传递一个指向我的类函数的指针。我已经尝试了大约 4 种不同的方法来做到这一点,除非我创建一个非类函数来传递,否则我每次都会遇到编译错误。

我试过通过this->*OnRender。我尝试将函数声明为 avirtual void和 as void (App::*OnRender)()。我尝试将其定义为void &App::OnRender() {};.

每次抱怨我的语法组合时都会出现不同的错误。我错过了一些东西。

4

2 回答 2

1
glutDisplayFunc(Render); //Why can't I put this->OnRender

因为 C 和 C++ 不是那样工作的。你在想的是所谓的闭包。this->Render是结合了两个不同元素的语法糖:

  • 指向某个类的某个实例的指针

  • 指向类成员的指针

两者必须以特定方式组合才能取消引用。在 C++ 中,您可以编写一个带有两个参数(指向类实例this的指针和指向类成员的指针&App::Render)的回调函数,但是您正在使用的框架GLUT是用 C 编写的,它的 API 是 C。而 C 不知道类和它不知道类成员,所以如果不做疯狂的事情,你尝试做的几乎是不可能实现的,比如使用ffcall就地创建闭包。

我的建议:不要使用 GLUT。GLUT 只是一些框架,您可以随时替换它。使用 Qt 怎么样?如果你想做所有的 C++ OOP,它得到了适当的 OpenGL 支持并且更好地使用。

于 2013-05-29T14:01:41.853 回答
0

解决这一困境的关键在于这三个GLUT功能。

int glutCreateWindow(char *name);
void glutSetWindow(int win);
int glutGetWindow(void);

没有窗口,你不能显示任何东西,你可以查询窗口。因此,您需要将此窗口int与指向您想要的任何内容的指针相关联:指向实例的指针或某个结构,无论您喜欢什么。例子:

static ::std::unordered_map<int, Window*> windows;

extern "C" void display_callback()
{
  auto const window_id(glutGetWindow());

  windows[window_id]->do_something();
}

如果您正在使用freeglut,请查看以下功能:

glutGetWindowData()
glutSetWindowData().
于 2014-03-16T11:03:01.303 回答