【问题标题】:Callback function inside class [closed]类内的回调函数[关闭]
【发布时间】:2013-02-03 15:35:07
【问题描述】:

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

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

【问题讨论】:

  • 这个“类内”有什么关系??

标签: c++ class function callback


【解决方案1】:

如果你使用 C++11,你可以使用std::function

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

我相信它在&lt;functional&gt;,所以记得#include &lt;functional&gt;

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

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

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

【讨论】:

  • 我正在使用 C++ 11(或者至少我可以强制 code::blocks 使用它)。使用stl相对于传统c风格有什么优势?
  • 恕我直言,我发现它更具可读性。您可以像使用对象或 STL 容器一样使用它。 STL 有很多东西可以提供。
【解决方案2】:

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

typedef void (*function_pointer)();

你可以这样写:

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

要调用它,您只需这样做:

pointer();

【讨论】:

  • 哦,哇,太好了,非常感谢。我将开始尝试实现这一点。
  • 什么是 typedef void (*function_pointer)();做?它是否声明了一个 void 指针,由于末尾的额外括号,编译器知道该指针指向一个函数?
  • 它声明了一个函数指针类型。括号是函数声明的一部分。您可以在那里添加参数。 void 只是函数的返回类型。例如,指向采用int 并返回bool 的函数的指针类型将是:typedef bool (*function_pointer)(int);
【解决方案3】:

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

typedef void (*function_pointer)();

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 1970-01-01
    相关资源
    最近更新 更多