Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使C风格回调面向对象?_C++_Liblacewing - Fatal编程技术网

C++ 使C风格回调面向对象?

C++ 使C风格回调面向对象?,c++,liblacewing,C++,Liblacewing,我使用的库具有如下回调: void onReceive (Lacewing::Server &Server, Lacewing::Server::Client &Client, char * Data, int Size) { /* callback body */ } Server.onReceive (onReceive); /* to register the handler */ class MyProcessingClass {

我使用的库具有如下回调:

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

Server.onReceive (onReceive); /* to register the handler */
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 );
    }
}
我希望能够将其封装在一个类中,该类可以决定在接收到数据包时执行什么操作(观察者模式)

如何使用C风格的回调实现这一点?库未定义要从中继承的接口


谢谢

如果我理解正确,你可以用两种不同的方法

假设此回调结构使用Data参数允许您将自己的数据传递给回调函数(一个常见的范例),您可以这样做:

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

Server.onReceive (onReceive); /* to register the handler */
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 );
    }
}

由于您使用的是liblacewing,因此每个类都为用户数据提供了一个
void*标记
成员:

/* 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);
}
然后:


是的,第二种方法正是我要处理的:(那么,singleton方法对您有效吗?或者您是否有其他一些要求阻止它的使用?感谢并感谢这个惊人的库:)您知道客户端-服务器类是否在iOS上工作吗?如果没有,是否有计划增加支持?