6

次のようなコールバックを持つライブラリを使用しています。

void onReceive (Lacewing::Server &Server, Lacewing::Server::Client &Client,
                char * Data, int Size) {
  /* callback body */
}

Server.onReceive (onReceive); /* to register the handler */

これを、パケットを受信したときに何をすべきかを決定できるクラス (オブザーバー パターン) でラップできるようにしたいと考えています。

C スタイルのコールバックでこれを行うにはどうすればよいですか? ライブラリは、継承元のインターフェイスを定義していません。

ありがとう

4

2 に答える 2

2

liblacewing を使用しているため、すべてのクラスにはvoid * Tagユーザー データ用に提供されたメンバーがあります。

/* class method */

void MyServer::onReceive (Lacewing::Server &Server, Lacewing::Server::Client &Client,
            char * Data, int Size)
{
     /* callback body - this is inside the class */
}


/* global function wraps the class method */

void onReceive (Lacewing::Server &Server, Lacewing::Server::Client &Client,
            char * Data, int Size)
{
    ((MyServer *) Server.Tag)->onReceive (Server, Client, Data, Size);
}

それから:

Server.Tag = myServerInstance; /* set the class instance pointer */
Server.onReceive (::onReceive); /* register the global function */
于 2012-05-26T20:01:41.370 に答える
1

私があなたを正しく理解していれば、2つの異なる方法でそれを行うことができます。

このコールバック構造がDataパラメーターを使用して、独自のデータをコールバック関数(一般的なパラダイム)に渡すことができると仮定すると、次のように実行できます。

class MyProcessingClass
{
public:
    MyProcessingClass();
    virtual ~MyProcessingClass();

    // Do whatever processing in this method
    virtual void onReceive(Lacewing::Server &Server, Lacewing::Server::Client &Client);
}

void onReceive (Lacewing::Server &Server, Lacewing::Server::Client &Client,
                char * Data, int Size)
{
    if ( Data != NULL )
    {
        MyProcessingClass *handler = reinterpret_cast<MyProcessingClass *>(Data);
        handler->onReceive( Server, Client );
    }
}

または、データポインターが「ユーザーデータポインター」の代わりに処理する必要があるものである場合は、おそらくシングルトン、ある種のグローバル変数などを使用する必要があります。私の経験では、これはコールバックを使用するあまり一般的ではない方法であり、うまくいけば、あなたが扱っているものではありません。

MyProcessingClass g_Processor;

MyProcessingClass *GetProcessor()
{
    return &g_Processor; // or some other way of getting your instance
}

void onReceive (Lacewing::Server &Server, Lacewing::Server::Client &Client,
                char * Data, int Size)
{
    MyProcessingClass *handler = GetProcessor();
    if ( handler != NULL )
    {
        handler->onReceive( Server, Client );
    }
}
于 2012-05-13T23:33:17.957 に答える