C++自定义Party类electionBudget成员变量修改后不更新问题咨询
问题排查及解决方案
你遇到的electionBudget无法修改的问题是C++值语义特性导致的,共有两个核心错误点:
1. 修改的对象与打印的对象不是同一份实例
你在事件逻辑中修改的是独立声明的party1/party2/party3变量,而打印时遍历的是partiesVector中的元素。如果当初你是将party1等变量拷贝存入vector,那么二者是完全独立的对象,修改独立变量不会同步到vector内的拷贝,自然打印出来的还是初始化值。
修复方案
直接操作vector中存储的实例即可,示例:
case 0: std::cout << debate.getEventName() << std::endl; std::cout << debate.getEventDecription() << std::endl; // 直接修改vector里的第一个政党实例,而不是独立的party1变量 partiesVector[0].spendMoneyOnEvent(500); std::cout << debate.haveDebate(partiesVector[0], partiesVector[1], partiesVector[2]); break;
补充:如果
haveDebate函数的参数是按值传递,也会出现拷贝修改不生效的问题,建议将函数参数改为const Party&类型(只读场景)或Party&类型(需要修改参数场景)。
2. 范围for循环按值遍历的问题
你当前写的遍历打印代码是按值捕获元素:
for(Party p : partiesVector){ std::cout << p.getPartyName() << " budget remaining: " << "$" << p.getElectionBudget() << std::endl; }
这里的p是vector中每个元素的临时拷贝,哪怕你后续需要在循环中修改元素的属性,修改的也只是临时拷贝,不会生效到原始对象。
修复方案
改为引用遍历即可,只读场景可加const保证安全:
// 只读场景用const引用 for(const Party& p : partiesVector){ std::cout << p.getPartyName() << " budget remaining: " << "$" << p.getElectionBudget() << std::endl; } // 需要修改元素的场景用非const引用 for(Party& p : partiesVector){ // 此处修改p的属性会直接同步到vector内的原始对象 }
内容的提问来源于stack exchange,提问作者Damon O'Neil
相关产品推荐
相关产品推荐

