为何Workload类的currentWorkload属性每次调用后都会重置为0?
核心问题出在Schedule::ValidateShiftForDay方法中对Contracts的拷贝操作,具体细节如下:
Contracts对象被拷贝而非引用
在std::unordered_map<std::string, Entities::Contract> Contracts = Helpers::Variables::getInstance().getContracts();这一行,你创建了全局Contracts的完整拷贝,而非获取引用。后续循环中拿到的Entities::Contract& contract = Contracts.at(IdContract);,引用的是拷贝出来的临时Contract对象,而非全局单例中的原对象。Workload实例是拷贝后的临时对象
每个Contract内部的Rules列表包含IConstrainable(比如Workload)的实例,当Contract被拷贝时,这些Rules里的Workload实例也会被一同拷贝。每次调用ValidateShiftForDay,都会生成全新的Contracts拷贝,对应全新的Workload实例——它们的currentWorkload初始值都是0。临时对象调用后被销毁
当ValidateShiftForDay方法执行完毕,拷贝出来的Contracts对象会被销毁,其中包含的Workload实例也会被释放。下次再调用ValidateShiftForDay时,又会重新生成新的拷贝,新的Workload实例的currentWorkload又回到初始的0值。
修正方案
将Contracts的定义改为引用类型,避免拷贝:
std::unordered_map<std::string, Entities::Contract>& Contracts = Helpers::Variables::getInstance().getContracts();
这样后续操作的都是全局单例中的原Contract对象,Workload实例也是同一个,currentWorkload的修改会被保留。
内容的提问来源于stack exchange,提问作者JS5

