微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将对象存储在列表中的 C++ 问题

如何解决将对象存储在列表中的 C++ 问题

这是我的代码

class Student {
   
    const std::string& Name;
    const std::string& Pinfo;
    std::map < std::string,float > Ngradelist;
    
public:

    Student(const std::string& n,const std::string& p,std::map < std::string,float > Ng) :
            Name(n),Pinfo(p),Ngradelist(std::move(Ng)) {}

    virtual void display() {
    
            std::cout << "Name: " << Name << std::endl;
            std::cout << "Personal information: " << Pinfo << std::endl;
            std::cout << "NCourse:" << std::endl;
            for(const auto& it : Ngradelist)
                std::cout << "   " << it.first << "   Grade: " << it.second <<  std::endl;
        }
    };

    void InsertListaStudenti(Student& student,std::list < Student > &listaStudenti) {

        listaStudenti.push_front(student);
    }



int main ()  {

    std::list < Student > listaStudenti;

    unsigned short option = 10;

    while(option != 0) {

        std::cout << "1.Add student." << std::endl;
        std::cout << "4.display Student." << std::endl;
        std::cout << "0 is for exit." << std::endl;

        std::cout << "Option is : ";

        std::cin >> option;
        switch  (option) {

            case 0 : {

                std::cout <<" You chose to leave.";
                exit;
                break;
            }

            case 1 : {

                std::string name,pinfo,course;
                float grade = 0;
                std::cout << "Insert name : ";
                std::cin >> name;
                std::cout << "Insert personal information : ";
                std::cin >> pinfo;
                std::cout << "Insert course : ";
                std::cin >> course;
                std::cout << "Insert grade : ";
                std::cin >> grade;
                Student student(name,{{course,grade}});
            //    listaStudenti.push_back(student);
               InsertListaStudenti(student,listaStudenti);
                break;
            }
            case 4: {

                for(auto &it : listaStudenti)
                    it.display();
                break;
            }
        }
    }
}

代码在不使用我存储这些数据的列表的情况下运行良好。当我添加一个学生时,没有问题,但是当我添加第二个学生时,第一个学生的NamePinfo会变成NamePinfo第二个学生。

我会举一个例子,这样你可能会更好地理解:

学生 1 有以下数据:Name=aPinfo=aCourse=agrade=1。 学生 2 具有以下数据:Name=bPinfo=bCourse=bgrade=2

如果我要显示,它会是这样的:学生 1 将有 b b a 1,学生 2 将有 b b b 2

有谁知道我该怎么做才能使这项工作发挥作用?我相信每次我在 main 中创建一个新对象时,这两个字段(NamePinfo)都会被覆盖,但我不确定......

解决方法

这是您定义 Student 成员的方式:

const std::string& Name;
const std::string& Pinfo;

您将它们声明为 references,这意味着它们将引用您的 main 函数中的原始变量。这将导致未定义行为,因为这些变量的生命周期是有限的,原始字符串将不复存在。

改用普通的非引用(和非常量)变量:

std::string Name;
std::string Pinfo;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。