1

我正在尝试为 sfml 窗口创建一个窗口容器。如果您不熟悉 sfml,则 sfml 窗口是一个不可复制的类,因此例如不能放在 std::vector 中。

我已经完成了大部分工作,但我现在正在尝试实现某种回调函数,该函数将在调用 window.Display() 以更新窗口之前完成 open-gl 绘图工作。

我无法理解回调函数的语法(c 或 c++ 版本)。有人愿意向我解释一个例子吗?

更好的是,有人愿意解释如何在类中实现回调函数的示例,以便可以将函数(用户定义的)传递给类的函数,该函数将记住该函数是什么所以它以后可以被类调用。

为了使上面的句子更清楚:我认为我需要三件事:

1):用户定义的函数,例如:

void doDrawing(){
    // do some open gl stuff
}

2 :) 类中的一个函数,它接受上述用户定义函数的参数:

void setDisplayFunc( ?argument of a function? argument ){
    function_pointer pointer = argument;
}

我不知道'argument'应该是什么类型,或者'function_pointer'必须是什么......我认为这是我最卡住的地方!

3:) 类可以调用上面分配的函数的一种方式。

// Do the function which is pointed at by pointer, which is of the type 'function_pointer' ... Whatever function_pointer happens to be!

如果有人以前使用过 glut,那么我想我正在尝试实现 glut 回调函数,如下所示:

void someDisplayFunction(){
    // do open gl stuff
}

glutDisplayFunc( someDisplayFunction );

上面的函数接受用户定义函数的参数,然后在我们调用 'glutPostRedisplay' 时执行它......

我希望这是有道理的,我已尝试提供尽可能多的信息来提供帮助。任何帮助表示赞赏。(:

4

3 回答 3

4

如果您使用的是 C++11,则可以使用std::function

void setDisplayFunc(const std::function<void()>& function) {
    function(); // call the function
}

我相信它<functional>,所以请记住#include <functional>

我也总是忘记函数指针的 C 风格语法,所以我非常喜欢在这种情况下使用 STL。您可以像使用任何其他对象一样管理它,它接近于 C# 等高级语言(我的意思是用于传递函数)。

如果您的项目没有使用 C++11,那么您将被旧语法困住。查看其他答案以了解如何使用它。

但是,如果您想稍后使用它,请查看文档以了解函数接受参数、传递默认参数等的语法。您可能会发现它对进一步使用很有用。

于 2013-02-03T15:41:31.900 回答
2

你想要一个函数指针。在你的情况下:

typedef void (*function_pointer)();

有了它,你可以写:

void setDisplayFunc(function_pointer argument){
    function_pointer pointer = argument;
}

要调用它,您只需执行以下操作:

pointer();
于 2013-02-03T15:40:19.883 回答
1

你想要做的是传递一个指向函数的指针,或者一个函数指针。

typedef void (*function_pointer)();

试试这个的类型argument。您实际上可以通过查看其标题来了解 glut 是如何做到的。

于 2013-02-03T15:40:02.363 回答