【问题标题】:c++ static observer classc++ 静态观察者类
【发布时间】:2017-03-01 15:16:36
【问题描述】:

我有两个程序:一个服务器和一个客户端

class client
{
 private:
  Network    net;
  Gui        gui;
};

这是网络类

class Network
{
  public:
   void      receivePacket(packet)
   {
     Protocol::readPacket(packet)
   }
};

这是 Gui 类

class Gui
{
 private:
  std::string   informations;

 public:
  void          displayInfo();
  void          updateInformation(information);
};

这里是协议

class Protocol
{
     static void     readPacket(packet)
     {
       if (packet.command == "refreshGui")
         //I need somehow to call GUI::UpdateInformation here and give the information from packet.information
     }
};

Protocol 被认为是一个“静态类”,这意味着它不应该被实例化。所以想法是,当Protocol::readPacket 从服务器获得packet 时,它应该能够将信息发送到GUI。但是,情况并非总是如此,因此传递点/参考并不是我想要的。

没有很好地说明,但想法是: - Protocol::readPacket 寻找如果我们需要打电话给GUI - 协议不应该有另一个参数,也不应该被实例化。

有人给了我关于使用观察者模式的建议。 Protocol 是主题,GUI 是观察者。但是,如果没有实例化协议,我就无法做到。

那么有没有办法在不实例化协议的情况下做到这一点?

【问题讨论】:

  • 什么是Protocol
  • @i_am_jorf 我更新了话题。

标签: c++ multithreading observer-pattern static-class


【解决方案1】:

在分布式计算中,节点的网络管理器接收消息并调用与消息类型相关的调度程序是一种常见的模式。您的需求非常相似。您可以这样做:

  • 在您的 Network 类中,维护一个 unordered_map。
  • 当您的程序启动时,将 std::pair
  • 推入该 unordered_map
  • 在 Network::receivePacket 中,从 unordered_map 中检索函数并调用它。

【讨论】:

  • 如果我不需要将 packet.information 中的信息提供给 GUI 就可以了
  • 在我的解决方案中,没有什么可以阻止您使用参数调用 Gui::UpdateInformation。
  • 但是 Gui::UpdateInformation 实际上应该在 Protocol::readPacket 中调用。
  • 想一想我给你的想法是一个高层次的指导方针,应该如何做。根据您的上下文进行调整。如果需要在 Protocol::readPacket 中调用 Gui::UpdateInformation,可以将 unordered_map 作为静态变量保存在 Protocol 的静态成员函数中。在 Procolol::readPacket 中,调用该静态成员函数以获取 unordered_map。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 2016-11-09
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多