Wenn ich versuchte zu zählen, wie man ein 1,2,3-Menü erstellen könnte, wären wir beide tot, bevor ich 1/2 von ihnen wiederholt hätte. Aber hier ist eine Methode, die Sie könnten versuchen Sie, um loszulegen (ungetestet, müssen Sie möglicherweise ein paar Dinge aufzuräumen):
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();
}
Als exercize, wie könnte ich Menüpunkte wie so definieren:
top_level.add()
("Drive off a cliff", &die_function)
("Destroy the world", &global_thermal_nuclear_war)
("Deeper", submenu()
("Hey, check this shit out!", &gawk))
;
Es kann mit dem obigen Rahmen als Ausgangspunkt getan werden.
Dies ist der Unterschied zwischen OO-Design und was "prozedural" genannt werden könnte. Ich habe eine Abstraktion hinter dem, was es bedeutet, eine Menüwahl zu sein (die ein anderes Menü sein kann), die in verschiedene Richtungen erweitert werden kann, erstellt. Ich erstelle die Erweiterungen, die ich brauche, lege sie zusammen und sage dem Ding, dass es gehen soll. Gutes OO-Design ist einfach so ... Der Hauptteil deines Programms besteht darin, Dinge zusammenzusetzen und zu sagen, dass es gehen soll.
Der Schlüssel dazu ist nicht notwendigerweise, es so zu machen, wie ich es gerade getan habe, sondern darüber anders zu denken. Wenn Sie den Kern des obigen Codes finden können, werden Sie sehen, dass Sie neue Elemente mit neuen Menüs zu beliebigen Tiefen hinzufügen können, ohne sich mit der Art des übermäßig komplizierten Codes, den der Schalterstil verursacht, auseinanderzusetzen.
Ich gehe davon aus, dass dies eine bevorzugte Lösung ist, da es flexibler ist, und Sie könnten das Framework-y Zeug in einer anderen Datei speichern und später darauf verweisen. –
Es ist sicherlich zu jedem Wechselweg vorzuziehen. Ja, Sie könnten es sicherlich mit einer Art von Dateiformat-Leser erweitern, so dass das Menü auch von externen Eingaben erstellt wurde. –
std :: struct in kill_everyone_item sollte durch std :: string ersetzt werden – Septagram