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

为何Workload类的currentWorkload属性每次调用后都会重置为0?

问题原因分析

核心问题出在Schedule::ValidateShiftForDay方法中对Contracts的拷贝操作,具体细节如下:

  1. Contracts对象被拷贝而非引用
    在std::unordered_map<std::string, Entities::Contract> Contracts = Helpers::Variables::getInstance().getContracts();这一行,你创建了全局Contracts的完整拷贝,而非获取引用。后续循环中拿到的Entities::Contract& contract = Contracts.at(IdContract);,引用的是拷贝出来的临时Contract对象,而非全局单例中的原对象。

  2. Workload实例是拷贝后的临时对象
    每个Contract内部的Rules列表包含IConstrainable(比如Workload)的实例,当Contract被拷贝时,这些Rules里的Workload实例也会被一同拷贝。每次调用ValidateShiftForDay,都会生成全新的Contracts拷贝,对应全新的Workload实例——它们的currentWorkload初始值都是0。

  3. 临时对象调用后被销毁
    当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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 20:24:32