gpt4 book ai didi

c++ - 数组中对象的私有(private)成员不可修改

转载 作者:搜寻专家 更新时间:2023-10-31 02:22:00 26 4
gpt4 key购买 nike

我知道有很多这方面的文献,但我还是想不通。让我从问题的一般描述开始,然后我将发布一个 MCVE。

描述:基本上我有一个对象数组 - 我可以获取它们私有(private)成员的值,但不能设置它们。我认为这与我编写 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 对象有关 - 但我尚未成功返回可修改的引用。

最佳答案

查看“getVip”方法的签名:

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

您正在按值返回“Vip”对象,这意味着您正在返回该对象的拷贝。对该拷贝调用任何方法都会导致对该拷贝的修改,而不是对数组中实际对象的修改。您想要做的(正如您已经提到的)是返回对象的引用,如下所示:

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"

请注意,在所有这三种情况下,方法主体都做完全相同的事情,只是方法的返回类型定义了是否创建拷贝。

关于c++ - 数组中对象的私有(private)成员不可修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30831483/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com