类成员变量不保存状态

时间:2013-12-04 15:46:11

标签: c++

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

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

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

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

我有一种方法可以通过contactpush_back()添加到此私有向量中。问题是,如果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);
}

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

再次,抱歉,如果这是一个菜鸟问题,但我完全难过,我不知道该搜索什么!我该如何解决这个引用问题?

3 个答案:

答案 0 :(得分:4)

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

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

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

注意我删除了const,否则您还必须将返回标记为const,否则您将无法对其进行修改。

答案 1 :(得分:3)

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

当你在上面调用push_back()时,只有副本才能获得额外的成员。

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

因此:

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

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

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

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

答案 2 :(得分:2)

当您致电get_contacts时,您会返回this->contacts的副本。如果你想共享一个向量,要么返回对它的引用(但你必须确保你的引用保持有效,这样你的类实例就不会被移动或复制),或者使用智能指针来动态分配空间你的向量并延长它的生命周期,直到最后一次引用它为止。在这种情况下,请使用类型为std::shared_ptr<std::vector<Contact> >

的成员