我正在尝试为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;
}
我不知道“论证”应该是什么类型,或者'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!
如果有人之前使用过剩,那么我想我正在尝试实现过剩的回调函数,如下所示:
void someDisplayFunction(){
// do open gl stuff
}
glutDisplayFunc( someDisplayFunction );
上面的函数接受用户定义函数的参数,然后在调用'glutPostRedisplay'时执行...
我希望这是有道理的,我已尽力提供尽可能多的信息来帮助。任何帮助表示赞赏。 (:
答案 0 :(得分:4)
如果您使用的是C ++ 11,则可以使用std::function。
void setDisplayFunc(const std::function<void()>& function) {
function(); // call the function
}
我相信<functional>
,所以请记住#include <functional>
。
我也总是忘记函数指针的C风格语法,所以我非常喜欢在这种情况下使用STL。您可以像使用任何其他对象一样管理它,它接近更高级别的语言,例如C#(对于传递函数,我的意思)。
如果您没有为项目使用C ++ 11,那么您将无法使用旧语法。请参阅其他答案以了解如何使用它。
如果您想稍后使用它,请查看doc语法,其中包含函数参数,传递默认参数等。您可能会发现它对于进一步使用非常有用。
答案 1 :(得分:2)
你想要一个函数指针。在你的情况下:
typedef void (*function_pointer)();
你可以这样写:
void setDisplayFunc(function_pointer argument){
function_pointer pointer = argument;
}
要调用它,您只需执行以下操作:
pointer();
答案 2 :(得分:1)
您要做的是将指针传递给函数或函数指针。
typedef void (*function_pointer)();
尝试使用argument
的类型。实际上,您可以通过查看其标题来了解它是如何过剩的。