C++ Java 等效处理程序

C++ Java Handler equivilent

我来自 Java/C# 背景并且是 C++ 的新手。我正在编写一个库,并试图实现与 Java 中的处理程序相同的功能。我的场景如下:

我正在构建一个 WinRT 库,用户将把它放入他的 mobile/desktop 应用程序中。在某些时候,在发生一些网络通信之后,会收到一条数据,我想将其传递给用户。在 Java 中,我声明了一个 public static Handler(但不初始化它),用户可以初始化它。当数据传入时,我通过该处理程序发送一条消息,最终用户在他们的应用程序中的声明被调用,接收消息并从中获取数据。

我似乎找不到在 C++ 中执行相同操作的方法。我查看了 delegates/function 指针上的各种 posts/documentation,利用强大的 Google 和 "callback"、"handler" 和 "delegate" 等关键字。我想我对它在 C++ 中的工作方式有所不同有一个半成型的理解,但没有任何结果。

谁能给我指出正确的方向?

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

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

并定义和实现一个 class 来监视事件并调用处理程序中定义的函数。 class 包含一个指针或指针列表、客户端安装的对象以及添加和删除客户端的方法。如果可能,根本不要使用指针,让 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;
}

最后,在 somethingwatcher 的应用程序逻辑中的某处,您检测到发生了什么并调用客户端。

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 中定义的 somethinghappened 函数之外,该库不需要知道任何关于客户端的信息。只要你有一个有效的指针,魔法就会发生。好吧,不是真的,但这不是进入 "magic" 工作原理的正确位置。

Client Land 的图书馆外...

客户端代码定义并实现了一个 class,它实现了 somethinghandler 以接收对某事发生的调用。

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

假设客户端代码已经实例化了一个名为 watcher 的 somethingwatcher,然后初始化例程会创建一个 somethingclient 并将其添加到 watcher。

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