You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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);
}

修正说明

  1. 补充<iostream>头文件,解决编译依赖问题。
  2. 调整addOrder函数,在获取用户输入后直接计算付款金额,并将完整的data对象添加到List中,同时删除main里无效的push_back(order)。
  3. 修改displayOrder参数为const Customer &,避免修改List中的原始数据,显示时临时生成备注文本,不改动结构体字段。
  4. 用范围for循环遍历List,代码更简洁易读。

内容的提问来源于stack exchange,提问作者Ariff Chang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 03:40:36