0

この質問を検索する方法がよくわかりませんでした。

次のシナリオで組み込みシステムの設計を行っています。

  • キーパッド、ディスプレイ、通信ポートなど、多数のハードウェア インターフェイスを作成する必要があるメイン アプリケーション クラスがあります。

  • これで、これらすべてのオブジェクトをメイン アプリケーションで使用できるようになりました。

  • アプリケーション クラスには、いくつかのサブ クラスが含まれており、そこに入ってしばらく留まることができます。1 つの例は、メニューが閉じられるまでそのクラスに入って実行されるメニュー クラスです。

  • アプリケーションレベルで作成された多くのハードウェアオブジェクトと対話するメニュークラスも必要です

  • グローバル変数を使用せずにこれを行う最善の方法は何ですか? この問題の良い解決策はありますか?

各オブジェクトをメニュー クラスに渡すことはできますが、20 個の引数を持つコンストラクターを作成したくありません。私の現在の解決策は、すべてのオブジェクトを構造体に入れ、その構造体をサブクラスのコンストラクターに渡すことです。そうすれば、彼らもアクセスできます。

このアプローチについて私を悩ませているのは、私があまり好きではないアプリケーションの外部で構造を定義しなければならないことです。それは最善の解決策ではないと何かが私に言い続けています。

どんな提案にもオープンです。

4

1 に答える 1

0

おそらく、キーパッドは 1 つです。したがって、「キーパッド インターフェイス オブジェクト」は 1 つだけですよね?ディスプレイも同様です [わかりました、2 つのディスプレイがあるかもしれませんが、それでも]。

したがって、私の提案は、登録と、登録されたインターフェースを保持する「コンテナー」を次のようにすることです。

class KeyPad
{
 public:
    int getKeyPressed();
};

class Display
{
  public:
     OutputText(std::string msg);
};


... bunch of other stuff ... 

class HardwareRegistry
{
   priviate:
      Keypad  *keypad;
      Display *display;

      static HardwareRegistry *myself; 

   public:
      Keypad*  GetKeypad() { return keypad; }
      Display* GetDisplay() { return display; }
      void RegisterKeypad(Keypad *akeypad) { keypad = akeypad; }
      void RegisterDisplay(Display *adisplay) { display = adisplay; } 


      static HardwareRegistry* GetHwRegistry() 
      { 
         if (!myself) myself = new HardwareRegistry; 
         ASSERT(myself);  // If we don't have a pointer now, panic!
         return myself; 
      }
 };

次に、HardwareRegistry を提供するシングルトン パターンを用意し、ハードウェアの初期化中にデバイスを作成するときにデバイスを登録します。

もちろん、さまざまな種類のキーパッド、ディスプレイなどをサポートする場合は、それらを「インターフェイス基本クラス」で実装すると、レジストリはたとえば KeypadBase タイプを返します。

于 2013-01-31T17:02:25.970 に答える