Класс статического наблюдателя C++

У меня есть две программы: сервер и клиент

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 получить packet с сервера, он должен иметь возможность отправлять информацию GUI, Однако, это не всегда так, поэтому передача точки / ссылки - это не то, что я ищу.

Это не очень хорошо проиллюстрировано, но идея такова: Protocol::readPacket искать, если нам нужно позвонить GUI- Протокол не должен принимать другой аргумент и не должен быть создан.

Кто-то дал мне совет по использованию шаблона Observer. Protocol будет предметом и GUI Наблюдатель. Однако я не смог бы сделать это без создания протокола.

Так есть ли способ сделать это без создания экземпляра протокола?

1 ответ

Решение

В распределенных вычислениях сетевой менеджер узла обычно принимает сообщение и вызывает диспетчер, связанный с типом сообщения. Ваша потребность очень похожа. Вот что вы могли бы сделать:

  • В своем классе Network сохраните unordered_map.
  • Когда ваша программа запустится, вставьте в это unordered_map std:: pair<"refreshGui", Gui:: UpdateInformation>
  • В Network::receivePacket извлеките функцию из unordered_map и вызовите ее.
Другие вопросы по тегам