如何解决将对象存储在列表中的 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;
}
}
}
}
代码在不使用我存储这些数据的列表的情况下运行良好。当我添加一个学生时,没有问题,但是当我添加第二个学生时,第一个学生的Name
和Pinfo
会变成Name
和Pinfo
第二个学生。
我会举一个例子,这样你可能会更好地理解:
学生 1 有以下数据:Name=a
、Pinfo=a
、Course=a
、grade=1
。
学生 2 具有以下数据:Name=b
、Pinfo=b
、Course=b
、grade=2
。
如果我要显示,它会是这样的:学生 1 将有 b b a 1,学生 2 将有 b b b 2
有谁知道我该怎么做才能使这项工作发挥作用?我相信每次我在 main 中创建一个新对象时,这两个字段(Name
和 Pinfo
)都会被覆盖,但我不确定......
解决方法
这是您定义 Student
成员的方式:
const std::string& Name;
const std::string& Pinfo;
您将它们声明为 references,这意味着它们将引用您的 main
函数中的原始变量。这将导致未定义行为,因为这些变量的生命周期是有限的,原始字符串将不复存在。
改用普通的非引用(和非常量)变量:
std::string Name;
std::string Pinfo;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。