0

我不太确定如何搜索这个问题。

我正在使用以下场景进行嵌入式系统设计。

  • 我有一个主要的应用程序类,它需要创建一堆硬件接口,如键盘、显示器、通信端口等……一大堆东西

  • 现在我可以在主应用程序中使用所有这些对象,这很棒

  • 应用程序类包含一些子类,它可以进入并保留一段时间。一个例子是一个菜单类,它进入并在该类中运行,直到菜单关闭

  • 我需要菜单类还与在应用程序级别创建的许多硬件对象进行交互

  • 不使用全局变量的最佳方法是什么?这个问题有好的解决方案吗?

我可以将每个对象传递给菜单类,但我不想创建一个有 20 个参数的构造函数。我目前的解决方案是将所有对象放入一个结构中并将该结构传递给子类构造函数。这样他们也可以访问。

这种方法让我感到困扰的部分是我必须在我不喜欢的应用程序之外定义结构。有些东西一直告诉我这不是最好的解决方案。

接受任何建议。

4

1 回答 1

0

据推测,只有一个键盘 - 因此只有一个“键盘接口对象”,对吧?与显示类似 [好吧,可能有两个显示,但仍然]。

所以我的建议是有一个注册和一个保存注册接口的“容器”,如下所示:

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 回答