簡體   English   中英

將指針傳遞給成員函數

[英]Passing a pointer to member function

有很多示例,但是我似乎無法找出解決問題的方法。 我有

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

簽名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傳遞實例指針。

如果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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM