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, pinfo, {{course, grade}});
// listaStudenti.push_back(student);
InsertListaStudenti(student,listaStudenti);
break;
}
case 4: {
for(auto &it : listaStudenti)
it.Display();
break;
}
}
}
}
该代码可以在不使用存储这些数据的列表的情况下正常工作。当我添加一个学生时,没有问题,但是当我添加第二个学生时,Name
第Pinfo
一个学生的and会变成第二个学生的Name
and 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
有谁知道我能做些什么来完成这项工作?我相信每次我在主目录中创建一个新对象时,这两个字段(Name
和Pinfo
)都会被覆盖,但我不确定......
解决方案
这是您定义Student
成员的方式:
const std::string& Name;
const std::string& Pinfo;
您将它们声明为referencesmain
,这意味着它们将引用您函数中的原始变量。这将导致未定义的行为,因为这些变量的生命周期是有限的,并且原始字符串将不复存在。
改用普通的非引用(和非常量)变量:
std::string Name;
std::string Pinfo;
推荐阅读
- python - 窗口关闭后使用 tkinter checkbutton 值
- reactjs - 当我在面板中使用映射时如何只打开一个面板
- javascript - 在站点中添加最后更新时间(以分钟计)
- hibernate - 无法使用 JOIN 查询实体
- codenameone - 将现有的 Codenameone 项目从 Netbeans/Eclipse 导入/打开到 IntelliJ 不起作用
- javascript - 如何在简单数组上实现空间修剪
- wso2developerstudio - 在 WSO2 Developer Studio 中开发 API 时,如何将自定义中介添加到 Eclipse 调色板?
- javascript - 使用自定义函数拆分数组
- javascript - RxJS 过滤器/搜索主题、可观察或行为主题
- ios - 通过 Segue 将数据传递给新的 ViewController