使用STL List存储结构体值并传引用调用时的取值问题
C++ STL List结构体存储与调用问题求助
我正在学习C++数据结构,复习首次实验内容时遇到问题:无法正确调用函数中存储的结构体值,不确定是未存入STL List、调用方式错误还是存储方式有误。经讲师指导修改代码后未在课堂验证,多次查阅网上示例调整后问题依旧,特附上代码寻求帮助:
#include<list> #include<string> using namespace std; struct Customer{ string Name; int Quantity; float Payment; string Remark; }; int menu() { int choice; cout << "::ROTI BOY PROGRAM MENU::\n"; cout << "1. Add order\n"; cout << "2. Display order\n"; cout << "3. Exit program\n"; cout << "Enter choice: "; cin >> choice; return choice; } void addOrder(list<Customer> *placeholder) { Customer data; cout << "\nEnter your name: "; cin >> data.Name; cout << "\nQuantity of buns: "; cin >> data.Quantity; cout << "\nExtra cheese (Y/N): "; cin >> data.Remark; } void displayOrder(Customer &data) { cout << "\nName: " << data.Name; cout << "\nQuantity: " << data.Quantity; if (data.Remark == "Y" || data.Remark == "y") data.Payment = data.Quantity*4.00; else data.Payment = data.Quantity*3.00; cout << "\nTotal: " << data.Payment << endl; if (data.Remark == "Y" || data.Remark == "y") data.Remark = "Extra Cheese"; else data.Remark = "None"; cout << "Remark: " << data.Remark << endl; } int main() { list<Customer>Record; Customer order; int choice; do { choice = menu(); switch (choice) { case 1: addOrder(&Record); Record.push_back(order); break; case 2: cout << "\nRecords of Orders "; list <Customer>::iterator it = Record.begin(), end = Record.end(); for (; it != end; ++it) { displayOrder(*it); cout << endl; } break; } } while (choice != 3); }
问题根源
addOrder未将输入数据存入List:函数内创建的Customer data获取了用户输入,但完全没有把这个对象添加到传入的List中;反而在main里把未初始化的空order对象推入List,导致存储的全是无效值。displayOrder修改原始数据:直接修改传入的结构体对象的Payment和Remark字段,会永久改变List中存储的原始数据,不符合仅显示的逻辑。- 缺失必要头文件:使用
cout、cin但未包含<iostream>,编译会报错。
修正后的代码
#include<list> #include<string> #include<iostream> // 补充缺失的输入输出头文件 using namespace std; struct Customer{ string Name; int Quantity; float Payment; string Remark; }; int menu() { int choice; cout << "::ROTI BOY PROGRAM MENU::\n"; cout << "1. Add order\n"; cout << "2. Display order\n"; cout << "3. Exit program\n"; cout << "Enter choice: "; cin >> choice; return choice; } void addOrder(list<Customer> *placeholder) { Customer data; cout << "\nEnter your name: "; cin >> data.Name; cout << "\nQuantity of buns: "; cin >> data.Quantity; cout << "\nExtra cheese (Y/N): "; cin >> data.Remark; // 提前计算付款金额,避免显示时修改原始数据 if (data.Remark == "Y" || data.Remark == "y") data.Payment = data.Quantity * 4.00f; else data.Payment = data.Quantity * 3.00f; // 将输入完成的data添加到List中 placeholder->push_back(data); } void displayOrder(const Customer &data) { // 改为const引用,禁止修改原始数据 cout << "\nName: " << data.Name; cout << "\nQuantity: " << data.Quantity; cout << "\nTotal: " << data.Payment << endl; // 临时生成备注文本,不修改结构体原始字段 string remarkText = (data.Remark == "Y" || data.Remark == "y") ? "Extra Cheese" : "None"; cout << "Remark: " << remarkText << endl; } int main() { list<Customer> Record; int choice; do { choice = menu(); switch (choice) { case 1: addOrder(&Record); // 移除错误的push_back(order),addOrder已完成数据添加 break; case 2: cout << "\nRecords of Orders:\n"; // 使用范围for循环简化遍历逻辑 for (const auto &customer : Record) { displayOrder(customer); cout << endl; } break; } } while (choice != 3); }
修正说明
- 补充
<iostream>头文件,解决编译依赖问题。 - 调整
addOrder函数,在获取用户输入后直接计算付款金额,并将完整的data对象添加到List中,同时删除main里无效的push_back(order)。 - 修改
displayOrder参数为const Customer &,避免修改List中的原始数据,显示时临时生成备注文本,不改动结构体字段。 - 用范围for循环遍历List,代码更简洁易读。
内容的提问来源于stack exchange,提问作者Ariff Chang
相关产品推荐
相关产品推荐

