类内部的回调函数

时间:2013-02-03 15:35:08

标签: c++ class function callback

我正在尝试为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'时执行...

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

3 个答案:

答案 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的类型。实际上,您可以通过查看其标题来了解它是如何过剩的。