C ++ Java Handler等效

时间:2015-06-02 23:37:49

标签: c++ callback delegates

我来自Java / C#背景,不熟悉C ++。我正在编写一个库,并且正在尝试完成与Handler在Java中相同的功能。我的方案如下:

我正在构建一个用户将其放入移动/桌面应用程序的WinRT库。在某些时候,在一些网络通信发生后,我会想要传递给用户的一段数据。在Java中,我声明了一个用户可以初始化的公共静态处理程序(但不要初始化它)。当数据进入时,我通过该处理程序发送消息,并调用最终用户在其应用程序中的声明,接收消息并从中获取数据。

我似乎无法找到在C ++中做同样事情的方法。我查看了有关委托/函数指针的各种帖子/文档,利用强大的Google和“callback”,“handler”和“delegate”等关键字。我认为我有一个半成熟的理解,它在C ++中的工作方式不同,但没有任何结果。

有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:0)

与在Java中完成相同。在您的库中,定义处理程序的纯虚拟类(或多或少类似于Java interface)。

class somethinghandler
{
public:
    virtual void somethinghappened(<stuff that happened>) = 0;
}

定义并实现一个类来监视事件并调用处理程序中定义的函数。此类包含指针,指针列表,客户端安装的对象以及添加和删除客户端的方法。如果可能的话,不要使用指针让something完成所有包含。生活就这样清洁。如果不能,请使用shared_ptr保护指针,以便在从观察者中删除之前不能轻易销毁它们。

class somethingwatcher
{
public:
    bool addClient(std::shared_ptr<somethinghandler> clientToAdd);
    bool removeClient(std::shared_ptr<somethinghandler> clientToRemove);
    void applogic();

private:
    std::shared_ptr<somethinghandler> client;
    // or std::vector<std::shared_ptr<somethinghandler>> clients;
}

最后,在某事物的应用程序逻辑中,您可以检测到发生的事情并致电客户端。

void somethingwatcher::applogic()
{
    // do stuff
    if(<something happened>)
    {
        // or iterate through the list of clients and doing for each:
        if (client != nullptr)
        {
            client->somethinghappened(<stuff that happened>);
        }
    }
}

除了存在之外,库不需要了解客户端的任何信息,并且实现了在somethinghandler中定义的某事物。只要你有一个有效的指针,就会发生魔法。嗯,不是真的,但这不是进入“魔术”如何运作的正确位置。

在Client Land的图书馆外...

客户端代码定义并实现了一个实现somethinghandler的类,以接收对某些内容的调用。

class somethingclient: public somethinghandler
{
public:
    void somethinghappened(<stuff that happened>);
    \\ handles something happening.
}

假设客户端代码已实例化名为watcher的thingwatcher,则初始化例程会创建并向观察者添加一个客户端。

std::shared_ptr<somethinghandler> handler = std::make_shared<somethingclient>(constructor arguments);
watcher.addClient(handler);