如果我试图计算一个人创建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();
}
Run Code Online (Sandbox Code Playgroud)
作为一个练习,我如何定义菜单项如下:
top_level.add()
( "Drive off a cliff", &die_function )
( "Destroy the world", &global_thermal_nuclear_war )
( "Deeper", submenu()
( "Hey, check this shit out!", &gawk ))
;
Run Code Online (Sandbox Code Playgroud)
它可以用上面的框架作为起点来完成.
这是OO设计与可能被称为"程序"的区别.我创建了一个抽象背后的菜单选择(可以是另一个菜单),可以在各个方向扩展.我创建了我需要的扩展,将它们组合在一起,然后告诉它.好的OO设计就是这样...你的程序的主要部分包括把东西放在一起并告诉它去.
从中获取的关键不一定是按照我刚才的方式去做,而是以不同的方式思考它.如果您可以获得上述代码的要点,那么您将看到可以将新项目添加到任意深度,而无需处理交换机样式导致的过于复杂的代码.
| 归档时间: |
|
| 查看次数: |
10268 次 |
| 最近记录: |