将指针传递给成员函数

时间:2012-06-25 21:26:19

标签: c++ callback asynccallback member-pointers

有很多例子,但我似乎无法找出问题的解决方案。我有

class FooSource{
    ...

    void StartGetFoos(void (*callback)(vector<IFoo*>*, IAsyncResult));
    ...
}

当调用StartGetFoos()时,它会为了获取Foos而保留回调。当请求完成时(大约需要30秒),将使用结果调用已保存的回调。 我无法更改此方法的签名。

和其他地方我有一个班级

class FooUser {
    ...

    void FooUser::MyCallback(vector<IFoo*>* foos, IAsyncResult result) 
    {
          // marshall to UI thread and update UI
    }

    void init()
    {
         fooUser->StartGetFoos(??????);
         // how do I pass my callback member function here?
    }
}

2 个答案:

答案 0 :(得分:3)

签名void (*callback)(vector<IFoo*>*, IAsyncResult)上没有任何地方可以接收this指针,因此您无法使用成员函数。相反,您必须使用static成员函数:

class FooUser {
    static void MyCallback(vector<IFoo*>* foos, IAsyncResult result) 
    {
          // marshall to UI thread and update UI
    }

    void init()
    {
         fooUser->StartGetFoos(&FooUser::MyCallback);
    }
};

此处的问题是您将无法访问FooUser上的任何实例数据;这可能是也可能不是问题。

根据API的设计程度,可能有一种传递实例指针的方法,例如:通过IAsyncResult result

答案 1 :(得分:2)

如果IAsyncResult是传入的数据结构,然后再次退出操作,则可以使用自己的信息对其进行扩展。

class MyAsyncResult : public IAsyncResult
{
public:
   MyAsyncResult(FoorUser *sender) : sender(sender){}
   FooUser *sender;
};

然后,正如ecatmur所说,你可以为回调指定一个静态成员函数,但你也可以创建一个后面调用的常规成员函数:

静态成员函数无法访问类成员,但可以指定为通常需要正常C函数的回调函数。

class FooUser
{
    // static with no access to class members, but can be specified as a callback.
    static void MyCallback(vector<IFoo*>* foos, IAsyncResult *result) 
    {
          MyAsyncResult *res = (MyAsyncResult*)result;
          res->sender->MyCallback(foos, result);
    }

    void MyCallback(vector<IFoo*>* foos, IAsyncResult *result) 
    {
          // handle the actual callback here
    }

    void init()
    {
         IAsyncResult *res = new MyAsyncResult(this);
         fooUser->StartGetFoos(&foos, res);
    }
}