将应用程序对象传递到较低级别的类

时间:2013-01-31 16:46:22

标签: c++

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

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

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

  • 现在我在主要应用程序中有所有这些objets,我可以使用哪个很棒

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

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

  • 在不使用全局变量的情况下,最好的方法是什么?这个问题有一个很好的解决方案吗?

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

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

对任何建议持开放态度。

1 个答案:

答案 0 :(得分:0)

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

所以我的建议是注册和“容器”,其中包含注册的接口:

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; 
      }
 };

然后您只需要Singleton Pattern来提供您的HardwareRegistry,并在硬件初始化期间创建它们时注册设备。

当然,如果您支持不同类型的键盘,显示器等,那么您将使用“interface baseclass”实现那些,并且注册表返回KeypadBase类型。