使用getter函数向list执行push_back失败,求问题原因
问题分析与解决方案:向list添加元素失败的原因
嘿,我来帮你拆解一下代码里的问题,核心其实是个很容易踩的C++坑:
1. 为什么getStudentList().push_back(...)不生效?
你当前的getStudentList()函数是这么写的:
list<string> Student::getStudentList() const { return studentList; }
这里返回的是studentList的副本,不是原对象内部存储的那个list实例。当你调用getStudentList().push_back(...)时,你其实是在一个临时创建的、用完就销毁的list副本上添加元素,原对象的studentList完全没被改动,所以看起来代码“无法正常工作”。
2. 两种修复方案
方案一:让getter返回引用
如果你需要通过getter修改内部的list,把getStudentList()改成返回非const引用(同时可以保留一个const版本用于只读场景):
// 用于修改内部list的getter list<string>& Student::getStudentList() { return studentList; } // 只读场景的getter(可选) const list<string>& Student::getStudentList() const { return studentList; }
这样调用getStudentList().push_back(getStudentName())时,操作的就是原对象的studentList了。
方案二:类内部直接访问成员变量
既然addStudent()是Student类的成员函数,你完全可以直接访问studentList,没必要绕getter:
void Student::addStudent() { int studentAdd; cout<<"How many student do you want to add?"<<endl; cin>>studentAdd; for(int i=0;i<studentAdd;++i) { setStudentName("a"); studentList.push_back(getStudentName()); // 直接操作成员变量 } }
这种方式更直接,还能避免引用返回可能带来的外部误修改风险。
3. 额外提醒:setStudentName()的逻辑bug
你的setStudentName()函数逻辑有点混乱:
void Student::setStudentName(std::__cxx11::string b) { cout<<"Enter the student name"<<endl; cin >> studentName; // 先让用户输入给studentName int size = b.size(); if(size > 0 && size<20) studentName = b; // 然后又用参数b覆盖了输入的值? else cout<<"Please enter a name between 1-20 char"<<endl; }
这显然不符合“设置学生名字”的预期,应该是读取用户输入后,判断输入的长度再赋值:
void Student::setStudentName() { // 不需要参数,直接读取用户输入 cout<<"Enter the student name"<<endl; string inputName; cin >> inputName; int size = inputName.size(); if(size > 0 && size<20) studentName = inputName; else cout<<"Please enter a name between 1-20 char"<<endl; }
内容的提问来源于stack exchange,提问作者themmfa
相关产品推荐
相关产品推荐

