gpt4 book ai didi

c++ - 在命令行中创建菜单

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:02:58 26 4
gpt4 key购买 nike

如何在命令行程序中创建菜单?我尝试过类似的东西:

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 设计就是这样……程序的主要部分是将东西放在一起并告诉它运行。

从中得到的关键不是一定要按照我刚才的方式去做,而是要以不同的方式思考。如果您能理解上述代码的要点,那么您会发现您可以将新项目和新菜单添加到任意深度,而无需处理开关样式导致的那种过于复杂的代码。

关于c++ - 在命令行中创建菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4688055/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com