如何 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?