像java

时间:2015-11-20 20:48:14

标签: c++ function callback

我想知道是否有办法在C ++中实现回调,就像在Java中可能的那样? 更具体一点:在将回调函数传递给另一个函数时直接定义回调函数。

这样的事情:

int main(void) {

    ...

    myButton->addOnClickCallback(new myCallback(){

        // do some stuff.
    });

    return 0;
}

我在C ++中找不到类似的东西,所以我想知道它是否可行。 为了方便起见会很好:)

3 个答案:

答案 0 :(得分:2)

您可以进一步使用C ++ 11中的lambdas:

myButton->addOnClickCallback([](){

   // do some stuff.
});

这是唯一的直接方式。

如果没有,在其他解决方案中,您可以将指针传递给由&运算符(不是必需的)获取的函数,而不是new。其次,必须在main

之外定义该函数
myCallback() {
    // do some stuff.
}

int main (void) {
   myButton->addOnClickCallback(myCallback);
   return 0;
}

答案 1 :(得分:1)

由于lambdas已在另一个答案中介绍,这是另一种解决方案(实际上是Java的复制品):

#include <iostream>

struct Base {
  virtual void process() = 0;
};

void want_callback(Base& b) {
  b.process();
}

void foo() {
  struct X : Base {
    void process() {
      std::cout << "Process\n";
    }
  } callback;

  want_callback(callback);
}

答案 2 :(得分:0)

你也可以像Java那样完全这样做:一个需要与另一个类交互的类通过发布一个它希望协作者实现的接口来实现。该类通过调用回调接口上的方法来调用其协作者的方法。

我认为lambdas是来自C的泛化函数指针而不是回调。标准库使用简单谓词作为其算法的参数,lambda与这些算法配合使用。当两个协作对象之间来回通信变得更加复杂时,您必须传入多个lambdas:每个lambda用于预期的每个交互。管理这堆lambda变得很麻烦,并且使用界面开始赢得理解和可读性。

对于单次交互“火与忘记”并且回调的生命周期不会变得混乱,那么lambdas工作得很好。使用实现接口的类,您可以更直接地控制任何相关数据的生命周期,并更直接地表达两个对象之间交互的性质。

这种方法在他的回答中以谢尔文的代码为例。