如何从对象中调用我的回调函数?

时间:2015-03-24 19:48:34

标签: c++ c++11 callback

以下是一些代码:

typedef void (*ACallBack)(int i);

class SomeClass
{
private:
   ACallBack aCallBack;

public:
   void SetCallBack(ACallBack aCallBack);
};

void SomeClass::SetCallBack(ACallBack aCallBack)
{
   this->aCallBack = aCallBack;
}

class SomeOtherClass
{
private:
   SomeClass someClass;

public:
   void InitializeSomeClass();

private:
   void callBackMethod(int i);
};

void SomeOtherClass::InitializeSomeClass()
{
   this->changeVariable = 10;

   this->someClass.SetCallBack(this->callBackMethod); // DOESN'T WORK
   this->someClass.UseCallBack();
}

void SomeOtherClass::callBackMethod(int i)
{
}

void globalCallBack(int i)
{
   int myInt = i;
}

int main()
{
   SomeClass sC;
   sC.SetCallBack(globalCallBack); //WORKS!!
}

基本上,如果我尝试在SomeOtherClass中设置我的回调函数它不起作用,但是当我在main中全局设置它时它确实如此。我在这里缺少什么?

2 个答案:

答案 0 :(得分:1)

只需使用std::functionstd::bind()

typedef std::function<void(int i)> ACallBack;

// old code pretty much the same

int main()
{
    using namespace std::placeholders;

    SomeClass sC;
    sC.SetCallBack(globalCallBack); //WORKS!!
    SomeOtherClass oC;
    sC.SetCallBack(std::bind(&SomeOtherClass::callBackMethod,oC,_1)); //WORKS AS WELL!!
}

在这种情况下,您实际上不需要传递void *userData,但如果需要旧代码进行编译,也可以添加它。

答案 1 :(得分:0)

你必须使方法成为静态的:

static void callBackMethod(int i, void* userData);

如果你需要一个非静态方法的指针,即一个实例方法,它会变得更复杂。

typedef void ( myclass::*FUNC ) (int i, void* userData);

如果你想使用它,它就变成了一个hastlle:

myclass obj;        // instantiate myclass
FUNC f = &myclass::myfunc;  // assign address
( obj.*f ) ( 123, NULL );   // and call it