You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌套对象数据更新异常:Inventory类gold_值无法修改

问题分析

你遇到的问题确实是因为getInventory()返回的是party_inventory_的副本,调用addGold(50)只会修改这个临时副本的金币值,原Party对象内部的party_inventory_完全没变化,所以再次调用getGold()还是100。

下面是几种不用引用/指针的解决办法:

方案1:在Party类中封装Inventory的操作函数

直接在Party类里添加操作内部Inventory的成员函数,不用对外暴露整个Inventory对象,从根源避免副本问题。

补充Party类代码

// 在Party类的声明中添加以下函数
int getGold() {
    return party_inventory_.getGold();
}

void addPartyGold(int gold) {
    party_inventory_.addGold(gold);
}

使用示例

Party party1;
cout << party1.getGold() << endl; // 输出100
party1.addPartyGold(50);
cout << party1.getGold() << endl; // 输出150

方案2:给Party类添加setInventory函数,手动更新内部对象

如果必须保留getInventory()的设计,可以给Party类加一个赋值函数,先获取副本修改,再把修改后的对象赋值回原Party。

补充Party类代码

// 在Party类的声明中添加
void setInventory(const Inventory& inv) {
    party_inventory_ = inv;
}

使用示例

Party party1;
cout << party1.getInventory().getGold() << endl; // 输出100

// 先获取副本、修改,再赋值回原对象
Inventory temp_inv = party1.getInventory();
temp_inv.addGold(50);
party1.setInventory(temp_inv);

cout << party1.getInventory().getGold() << endl; // 输出150

方案3:修改Inventory的addGold函数返回自身,链式调用

让addGold返回修改后的Inventory对象,配合setInventory实现链式调用,写法更紧凑,但底层还是依赖副本传递。

修改Inventory的addGold函数

Inventory Inventory::addGold(int gold) {
    cout << "Entered addGold func. gold_: " << gold_ << " gold: " << gold << endl;
    gold_ += gold;
    return *this; // 返回当前对象的副本
}

使用示例

Party party1;
party1.setInventory(party1.getInventory().addGold(50));
cout << party1.getInventory().getGold() << endl; // 输出150

内容的提问来源于stack exchange,提问作者Wofster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 00:42:25