0

現在、データが必要なコマンドのリストをサーバーに送信するクライアントがあります。私のサーバーは、getProcAddress を使用して DLL 経由でこれらのコマンドをロードします。次に例を示します。

InitializeDLL initializeDLL = (InitializeDLL)GetProcAddress(hInstanceLibrary, "InitializeDLL");

ここで、initializeDLL は次のように定義されています。

typedef int (CALLBACK* InitializeDLL)(int,int);

クライアントは現在、データが必要な文字列としてコマンド名を送信しています。使用できるようにしたいコマンドのリストがかなりありますが、これを効率的に実装する方法がわかりません。Map を作成し、名前の文字列をキーとして使用し、適切な関数の CALLBACK* をポインターとして使用することを考えていました。しかし、その後もキャストする必要があります。私は主に Java プログラマーであり、最高の C++ プログラマーではないため、このマップのアイデアが機能するかどうか、または最後にキャストを処理する方法がわかりません。また、ウィキペディアで Command パターンを見ましたが、この場合にどのように実装されるかわかりません。

4

1 に答える 1

0

これを行うには、マップで問題ありません。特定のメッセージを受信したときに実行される関数ポインターにすべての文字列をマップするマップ。コマンドパターンに行きたい場合は、次のようなものを使用できます:免責事項、私は何年も前からC++コードを書いていないため、このコードはコンパイルできない可能性があります):

abstract class Command{
  private:
     string commandName;
     CALLBACK* callBackFunction
  public:
     Command(string name, CALLBACK* function){
        commandName = name;
        callBackFunction = function;
     }
     // Here, you can check your current environment
     // to see if you can execute this command in the current
     // configuration and system state
     bool CanExecute() = 0;

     // This method does the call to the callback
     void Execute(){
          // call the callback function here
     }
}

このパターンは、コマンドとファクトリ メソッドのパターンを組み合わせたものです。Command可能なすべてのエントリに対して抽象クラスから継承するコマンドを定義します。これで、関数ポインタを持つ文字列のマップを持つ代わりに、コマンドを持つ文字列のマップを持つことができます。文字列を取得したら、最初にコマンドを呼び出してCanExecute、現在の状態でコマンドを実行できるかどうかを確認します。を呼び出しExecuteて、コールバック関数を呼び出すコマンドを実行します。これは、コマンド、その実行の前提条件、および実行する実際のコードをカプセル化することについて考えることができる最良の方法です。

ちなみに、このパターンは現在 .NET (WPF) で広く使用されています。

于 2012-06-20T19:26:23.530 に答える