C++菜单生成器问题:菜品集中输出,如何修复分类显示?
问题排查与修复:菜单分类显示异常
核心错误分析
错误1:
add_dish方法未同步更新菜品类型
当前add_dish直接使用类默认的dish_type值(初始为0,对应appetizer)判断存储位置,但调用方法前没有根据传入的type参数更新dish_type,导致所有菜品都被存入appetizer向量。错误2:打印逻辑依赖单一变量,无法遍历所有分类
dishType是读取最后一个菜品后的类型值,只会触发某一个分类的打印逻辑,其他分类的菜品即使存在也无法显示。
修复方案
1. 修正add_dish方法,先同步菜品类型
在存储菜品前,先根据传入的type更新dish_type,确保菜品存入对应分类的向量:
void Dish::add_dish(string type, unsigned int price, string name) { // 先根据传入类型更新dish_type set_dish_type(type); if (dish_type == 0) { appetizer.push_back(make_pair(name, price)); } else if (dish_type == 1) { entree.push_back(make_pair(name, price)); } else if (dish_type == 2) { dessert.push_back(make_pair(name, price)); } }
2. 重构打印逻辑,直接遍历分类向量
移除对dishType变量的依赖,直接遍历每个分类的向量,有内容就打印:
// Printing out the Menu fout << "Menu\n\n"; fout << "Appetizers\n\n"; for (const auto& dish : menu.appetizer) { fout << dish.first << "($" << dish.second << ")\n"; } fout << "\nEntrees\n\n"; for (const auto& dish : menu.entree) { fout << dish.first << "($" << dish.second << ")\n"; } fout << "\nDesserts\n"; for (const auto& dish : menu.dessert) { fout << dish.first << "($" << dish.second << ")\n"; }
可选优化:优化set_dish_type的判断逻辑
用else if减少不必要的条件判断,提升效率:
void Dish::set_dish_type(string type) { if (type == "appetizer") { dish_type = 0; } else if (type == "entree") { dish_type = 1; } else if (type == "dessert") { dish_type = 2; } // 可选:添加无效类型的默认处理,比如设置为0或打印警告 }
内容的提问来源于stack exchange,提问作者Yoseph Hamid
相关产品推荐
相关产品推荐

