【问题标题】:Passing a pointer to member function传递指向成员函数的指针
【发布时间】:2012-06-27 04:42:17
【问题描述】:

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

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?
    }
}

【问题讨论】:

标签: c++ callback asynccallback member-pointers


【解决方案1】:

签名void (*callback)(vector&lt;IFoo*&gt;*, 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

【讨论】:

  • 您能否详细说明在这种情况下如何使用静态成员函数?我早些时候在看this post,看起来很有希望,但我无法根据我的情况改变事情。感谢您的帮助。
  • @ProfessorChaos,使用静态成员函数调用另一个非静态成员函数。为此,静态函数需要从某个地方获取一个对象指针,如果您从未有多个未完成的回调,则可能是一个静态成员指针变量。
【解决方案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);
    }
}

【讨论】:

    猜你喜欢
    • 2013-06-06
    • 2018-12-07
    • 1970-01-01
    • 2018-04-14
    • 2020-06-09
    • 2017-01-19
    • 2017-05-16
    • 1970-01-01
    相关资源
    最近更新 更多