嵌套对象数据更新异常: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
相关产品推荐
相关产品推荐

