Если бы я попытался сосчитать, каким образом можно создать меню 1,2,3, мы оба были бы мертвы, прежде чем я повторил бы половину из них. Но вот один из способов, с помощью которого вы можете попытаться начать работу (не проверенный, вам может понадобиться очистить пару вещей):
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 ))
;
Это может быть сделано с вышеупомянутой структурой в качестве отправной точки.
В этом разница между ОО-дизайном и тем, что можно назвать «процедурным». Я создал абстракцию за тем, что значит быть выбором меню (которое может быть другим меню), которое можно расширять в различных направлениях. Я создаю нужные мне расширения, соединяю их и говорю, что нужно делать. Хороший ОО-дизайн просто так ... основная часть вашей программы состоит из того, чтобы собрать воедино все и заставить его работать.
Ключевым моментом, который нужно извлечь из этого, является не обязательно делать это так, как я это делал, а думать об этом по-другому. Если вы сможете понять суть приведенного выше кода, то увидите, что вы можете добавлять новые элементы, с новыми меню, на произвольную глубину, без необходимости иметь дело с чрезмерно сложным кодом, вызываемым стилем переключения.