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);
我来自 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);