0

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

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::readPacket获取 a时packet,它应该能够将信息发送到GUI. 但是,情况并非总是如此,因此传递点/参考并不是我想要的。

它没有很好地说明,但想法是: -Protocol::readPacket寻找我们是否需要调用GUI - 协议不应该接受另一个参数,也不应该被实例化。

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

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

4

1 回答 1

0

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

  • 在您的 Network 类中,维护一个 unordered_map< packet_type, std::function >。
  • 当您的程序启动时,将 std::pair<"refreshGui", Gui::UpdateInformation> 推入该 unordered_map
  • 在 Network::receivePacket 中,从 unordered_map 中检索函数并调用它。
于 2016-10-19T20:49:50.983 回答