[英]C++ problem with storing objects in a list
这是我的代码:
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, pinfo, {{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 将有 bba 1,学生 2 将有 bbb 2
有谁知道我能做些什么来完成这项工作? 我相信每次我主要创建一个新的 object 时,这两个字段( Name
和Pinfo
)都会被覆盖,但我不确定......
这是您定义Student
成员的方式:
const std::string& Name;
const std::string& Pinfo;
您将它们声明为引用,这意味着它们将引用main
function 中的原始变量。 这将导致未定义的行为,因为这些变量的生命周期是有限的,并且原始字符串将不复存在。
改用普通的非引用(和非常量)变量:
std::string Name;
std::string Pinfo;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.