类成员变量未保存状态

Class Member Variable not Saving State

本文关键字:保存 状态 变量 成员      更新时间:2023-10-16

我是C/C++的新手,所以如果这是一个愚蠢的问题,请原谅。

我有一个控制器类,它有一个私有成员变量vector<Contact> contacts。该类具有允许我们更改该向量的状态的方法(标准CRUD操作)。

该类有一个名为get_contacts()的公共方法,它返回对象的私有向量:

std::vector<Contact> Contacts_Controller::get_contacts() const {
    return this->contacts;
}

我有一个方法,通过push_back()contact添加到这个私有向量。问题是,如果add_contact()方法使用访问器方法,则类变量不会得到更新:

void Contacts_Controller::add_contact(const Contact &contact) {
    this->get_contacts().push_back(contact);
}

假设这是内存问题,也许我在使用const时遇到了一些问题,或者我没有正确使用引用,因为以下代码完全符合预期:

void Contacts_Controller::add_contact(const Contact &contact) {
    this->contacts.push_back(contact);
}

使用任何一种方法都不会返回任何错误,但如果我在使用第一种方法后请求联系人的矢量,它将为空,而第二种方法会正确地将数据添加到矢量中。

同样,如果这是一个愚蠢的问题,我很抱歉,但我完全被难住了,我不知道该搜索什么!我将如何解决此引用问题?

"该类有一个名为get_contacts()的公共方法,它返回对象的这个私有向量"

不,它返回一份副本。您需要通过引用返回以获得实际成员:

std::vector<Contact>& Contacts_Controller::get_contacts(){
    return this->contacts;
}

注意我删除了const,否则您将不得不将返回标记为const,并且无法修改它。

问题是函数按值返回向量,这意味着调用函数会得到一个副本。

当您对其调用push_back()时,只有副本会获得额外的成员。

您的函数可能会返回一个引用。然后您的用户可以调用push_back()。如果它是类的成员变量,并且您返回的是一个非常数引用(必须允许修改),那么您的函数可能也是非常数的。

因此:

std::vector<Contact> & Contacts_Controller::get_contacts()  // not const
  {  return this->contacts; }

您也可以将只读版本作为重载。

std::vector<Contact> const & Contacts_Controller::get_contacts() const
  {  return this->contacts; }

此版本允许对联系人进行只读访问,也可以是常量成员函数。

调用get_contacts时,返回this->contacts的副本。如果你想共享一个向量,可以返回一个对它的引用(但你必须确保你的引用保持有效,这样你的类实例就不会被移动或复制),也可以使用智能指针为你的向量动态分配空间,并延长其生存期,直到最后一个对其的引用被破坏。在这种情况下,使用类型为std::shared_ptr<std::vector<Contact> > 的成员