数组中对象的私有成员不可修改

时间:2015-06-14 15:58:07

标签: c++ pointers

我知道有很多关于此的文献,但我仍然无法弄明白。让我先从问题的一般描述开始,然后我将发布一个MCVE。

描述:基本上我有一个对象数组 - 我可以获取私有成员的值,但不能设置它们。我认为这与我如何编写setter方法有关,但我不确定如何修改它以使其正确。

的main.cpp

Store walmart;
Vip vip;

//  set vip points to 100
vip.setPoints(100);
walmart.setVip(vip, 0);
cout << "Points (before): " << walmart.getVip(0).getPoints() << endl;

//  set vip points to 200
walmart.getVip(0).setPoints(200);
cout << "Points (after): " << walmart.getVip(0).getPoints() << endl;

控制台输出

Points (before): 100
Points (after): 100  // <-- hoping this will be 200!

Store.cpp

void Store::setVip(Vip vip, int index) {
    this->vip[index] = vip;
}
Vip Store::getVip(int index) {
    return this->vip[index];
}

Vip.cpp

void Vip::setPoints(double points) {
    this->points = points;
}
double Vip::getPoints() {
    return this->points;
}

在谷歌搜索这个问题后,我确信问题与我如何使用getVip(int index) getter方法返回Store.cpp文件中的VIP对象有关 - 但我还没有成功返回可修改的参考。

2 个答案:

答案 0 :(得分:1)

函数getVip按值返回Vip对象,换句话说,复制并返回。修改副本当然不会修改原件。而是通过引用返回。

答案 1 :(得分:1)

查看“getVip&#39;”的签名。方法:

Vip Store::getVip(int index) { ... }
^^^ 

你正在回归&#39; Vip&#39;按值对象,这意味着您将返回对象的COPY。在该副本上调用任何方法将导致修改该副本,而不是数组中的实际对象。您想要做的事情(正如您已经提到的那样)是将REFERENCE返回给对象,如下所示:

Vip& Store::getVip(int index) { return vip[index]; }
   ^ 
   "reference to a Vip object"

这样,您就可以修改数组中的对象。如果您不想修改对象,返回引用通常仍然可行,只是为了防止不必要的副本,在这种情况下,您将返回一个const引用:

const Vip& Store::getVip(int index) const { return vip[index]; }
^^^^^    ^ 
"constant reference to a vip object"

请注意,在所有三种情况下,方法的主体完全相同,只有方法的返回类型定义是否创建副本。