1

そこにはたくさんの例がありますが、それでも私は自分の問題の解決策を理解できないようです。私は持っています

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

2 に答える 2

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

于 2012-06-25T21:28:25.133 に答える
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);
    }
}
于 2012-06-25T21:55:34.543 に答える