我来自Java / C#背景,不熟悉C ++。我正在编写一个库,并且正在尝试完成与Handler在Java中相同的功能。我的方案如下:
我正在构建一个用户将其放入移动/桌面应用程序的WinRT库。在某些时候,在一些网络通信发生后,我会想要传递给用户的一段数据。在Java中,我声明了一个用户可以初始化的公共静态处理程序(但不要初始化它)。当数据进入时,我通过该处理程序发送消息,并调用最终用户在其应用程序中的声明,接收消息并从中获取数据。
我似乎无法找到在C ++中做同样事情的方法。我查看了有关委托/函数指针的各种帖子/文档,利用强大的Google和“callback”,“handler”和“delegate”等关键字。我认为我有一个半成熟的理解,它在C ++中的工作方式不同,但没有任何结果。
有人能指出我正确的方向吗?
答案 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);