0

サーバーとクライアントの 2 つのプログラムがあります。

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-pattern の使用について誰かがアドバイスをくれました。ProtocolサブジェクトとGUIオブザーバーになります。しかし、Protocol をインスタンス化しないと作れませんでした。

Protocol をインスタンス化せずにそれを行う方法はありますか?

4

1 に答える 1

0

分散コンピューティングでは、ノードのネットワーク マネージャがメッセージを受信し、メッセージ タイプに関連付けられたディスパッチャを呼び出すのが一般的なパターンです。あなたのニーズは非常に似ています。これがあなたができることです:

  • Network クラスで、unordered_map< packet_type, std::function > を維持します。
  • プログラムが起動したら、その unordered_map に std::pair<"refreshGui", Gui::UpdateInformation> をプッシュします。
  • Network::receivePacket で、unordered_map から関数を取得して呼び出します。
于 2016-10-19T20:49:50.983 に答える