如何 push_back 到具有 getter 功能的列表?
How to push_back to a list with getter function?
我有 getter setter 这样的功能。
void Student::setStudentName(std::__cxx11::string b)
{
cout<<"Enter the student name"<<endl;
cin >> studentName;
int size = b.size();
if(size > 0 && size<20)
studentName = b;
else
cout<<"Please enter a name between 1-20 char"<<endl;
}
string Student::getStudentName() const
{
return studentName;
}
我想做的是使用 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");
getStudentList().push_back(getStudentName());
}
}
我试过这样但是
getStudentList().push_back(getStudentName());
此代码无效。可能是什么问题呢?
这是列表的 getter/setter
void Student::setStudentList(list<string> a)
{
studentList = a;
}
list<string> Student::getStudentList() const
{
return studentList;
}
问题在于 getStudentList
的 return 类型。就目前而言,您正在 return 创建它的副本,然后附加到临时副本,临时副本随后会立即被销毁。
您想要的是return对实际列表的引用。
list<string> &Student::getStudentList() {
return studentList;
}
你不应该创建这样的函数 const
因为它(可能)是一个 mutator.
const
的问题有时通过两次覆盖 getStudentList
来处理。一个在 return 类型和 cv-qualifier 中都是 const
,而另一个在两者中都不是 const。
// accessor override
const list<string> &Student::getStudentList() const {
return studentList;
}
// mutator override
list<string> &Student::getStudentList() {
return studentList;
}
这样可以在不同的调用场景中推断出适当的覆盖。
正如上面的答案,你需要return一个参考,这样你就可以通过push_back更新它,这也解释了为什么你需要删除 const.
list<string> &Student::getStudentList() {
return studentList;
}
注意 :: 注意 return 对 local/not 自变量的引用。
请看Is the practice of returning a C++ reference variable evil?。
我有 getter setter 这样的功能。
void Student::setStudentName(std::__cxx11::string b)
{
cout<<"Enter the student name"<<endl;
cin >> studentName;
int size = b.size();
if(size > 0 && size<20)
studentName = b;
else
cout<<"Please enter a name between 1-20 char"<<endl;
}
string Student::getStudentName() const
{
return studentName;
}
我想做的是使用 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");
getStudentList().push_back(getStudentName());
}
}
我试过这样但是
getStudentList().push_back(getStudentName());
此代码无效。可能是什么问题呢?
这是列表的 getter/setter
void Student::setStudentList(list<string> a)
{
studentList = a;
}
list<string> Student::getStudentList() const
{
return studentList;
}
问题在于 getStudentList
的 return 类型。就目前而言,您正在 return 创建它的副本,然后附加到临时副本,临时副本随后会立即被销毁。
您想要的是return对实际列表的引用。
list<string> &Student::getStudentList() {
return studentList;
}
你不应该创建这样的函数 const
因为它(可能)是一个 mutator.
const
的问题有时通过两次覆盖 getStudentList
来处理。一个在 return 类型和 cv-qualifier 中都是 const
,而另一个在两者中都不是 const。
// accessor override
const list<string> &Student::getStudentList() const {
return studentList;
}
// mutator override
list<string> &Student::getStudentList() {
return studentList;
}
这样可以在不同的调用场景中推断出适当的覆盖。
正如上面的答案,你需要return一个参考,这样你就可以通过push_back更新它,这也解释了为什么你需要删除 const.
list<string> &Student::getStudentList() {
return studentList;
}
注意 :: 注意 return 对 local/not 自变量的引用。
请看Is the practice of returning a C++ reference variable evil?。