簡體   English   中英

在命令行中創建菜單

[英]create menus in command line

如何在命令行程序中創建菜單? 我試過像這樣的東西:

cin >> input;
switch (input) {
  case (1):
    // do stuff
  case (2):
    // ...
}

但后來我遇到了子菜單的問題,並回到了相同的菜單等。我寫的第一個程序(除了練習)試圖使用菜單的switch想法有goto語句,因為替代方案是(當時)大量復雜的循環。

如果我試圖計算一個人創建1,2,3菜單的方式,那么在我迭代其中的1/2之前我們都已經死了。 但是這里有一種方法可以讓你開始(未經測試,你可能需要清理幾件事):

struct menu_item
{
  virtual ~menu_item() {}
  virtual std::string item_text() const = 0;
  virtual void go() = 0;
};

struct print_hello_item
{
  std::string item_text() const { return "display greeting"; }
  void go() { std::cout << "Hello there, Mr. User."; }
};

struct kill_everyone_item
{
  std::string item_text() const { return "Go on murderous rampage"; }
  void go() { for(;;) kill_the_world(); }
};

struct menu_menu_item
{
  menu_menu_item(std::string const& text) : text_(text), items() {}
  void add_item(std::unique_ptr<menu_item> item) { items.push_back(std::move(item)); }
  void go()
  {
    std::cout << "Choose: \n";
    std::for_each(items.begin(), items.end(), [](std::unique_ptr<menu_item> const& item)
    {
      std::cout << "\t" << item->item_text() << "\n";
    });
    std::cout << "\n\n\tYour choice: ";
    int choice = get_number_from_console();
    if (items.size() > choice) items[choice]->go();
  }
  std::string item_text() const { return text_; }

private:
  std::string text_;
  std::vector<std::unique_ptr<menu_item> > items;
};

int main()
{
  menu_menu_item top_item;
  top_item.add(std::unique_ptr<menu_item>(new print_hello_item));
  top_item.add(std::unique_ptr<menu_item>(new kill_everyone_item));

  top_item.go();
}

作為一個練習,我如何定義菜單項如下:

top_level.add()
  ( "Drive off a cliff", &die_function )
  ( "Destroy the world", &global_thermal_nuclear_war )
  ( "Deeper", submenu()
                ( "Hey, check this shit out!", &gawk ))
;

它可以用上面的框架作為起點來完成。

這是OO設計與可能被稱為“程序”的區別。 我創建了一個抽象背后的菜單選擇(可以是另一個菜單),可以在各個方向擴展。 我創建了我需要的擴展,將它們組合在一起,然后告訴它。 好的OO設計就是這樣...你的程序的主要部分包括把東西放在一起並告訴它去。

從中獲取的關鍵不一定是按照我剛才的方式去做,而是以不同的方式思考它。 如果您可以獲得上述代碼的要點,那么您將看到可以將新項目添加到任意深度,而無需處理交換機樣式導致的過於復雜的代碼。

您可以使用您的方法將菜單中的子菜單集成:

cin >> input;
switch (input) {
  case (1): 
    cin >> input;
    switch (input) {
       case (1): //do stuff
       case (2): //do stuff
    }
    break;
  case (2):
    break;
}

這是你在找什么? 否則:你想要解決什么?

編輯:那么你需要的是一個帶有中斷條件的子菜單中的附加循環?

do{
    cin >> input;
    switch (input) {
      case (1): 
        do{
          cin >> input;
          switch (input) {
            case (1): //do stuff
            case (2): //do stuff
          }
        }while(input != 3);
        break;
      case (2):
        break;
    }
  }while(true);

我剛剛在Libraries問了一個類似的問題來顯示文本模式菜單? - 看起來ncurses會大大簡化菜單顯示部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM