记录成员变量赋值的坑
先上错误代码:
//闯红灯1
if(AgainstRedLight == algVIRConfigInput.currentEIllegalType)
{
processForAgainstRedLight(labels, algVIRConfigOutput);
}
//越线停车2
if(CoverStopLine == algVIRConfigInput.currentEIllegalType)
{
processForCoverStopLine(labels, algVIRConfigOutput);
}
//违反导向3
if(AgainstDirection == algVIRConfigInput.currentEIllegalType)
{
processForAgainstDirection(labels, algVIRConfigOutput);
}
//逆行4
if(Retrograde == algVIRConfigInput.currentEIllegalType)
{
processForRetrograde(labels, algVIRConfigOutput);
}
//压实线5
if(CrossLine == algVIRConfigInput.currentEIllegalType)
{
processForCrossLine(labels, algVIRConfigOutput);
}
//违法变道6
if(IllegalLaneChange == algVIRConfigInput.currentEIllegalType)
{
processForIllegalLaneChange(labels, algVIRConfigOutput);
}
//借道超车7
if(AgainstInsert == algVIRConfigInput.currentEIllegalType)
{
processForAgainstInsert(labels, algVIRConfigOutput);
}
//手持违停
if(ViolationParking == algVIRConfigInput.currentEIllegalType)
{
processForViolationParking(labels, algVIRConfigOutput);
}
//黄网格停车
if(YellowGridParking == algVIRConfigInput.currentEIllegalType)
{
processForYellowGridParking(labels, algVIRConfigOutput);
}
//占用公交车道
if(AgainstBusLaneWithSign == algVIRConfigInput.currentEIllegalType)
{
processForAgainstBusLaneWithSign(labels, algVIRConfigOutput);
}
//占用非机动车道
if(AgainstBicycleLane == algVIRConfigInput.currentEIllegalType)
{
processForAgainstBicycleLane(labels, algVIRConfigOutput);
}
//占用紧急车道
if(AgainstEmergencyLane == algVIRConfigInput.currentEIllegalType)
{
processForAgainstEmergencyLane(labels, algVIRConfigOutput);
}
//高速超速
if(AgainstHighSpeed == algVIRConfigInput.currentEIllegalType)
{
processForAgainstAgainstHighSpeed(labels, algVIRConfigOutput);
}
//礼让行人
if(AgainstLetPedestrian == algVIRConfigInput.currentEIllegalType)
{
processForAgainstAgainstLetPedestrian(labels, algVIRConfigOutput);
}
//主驾打电话
if(AgainstCalling == algVIRConfigInput.currentEIllegalType)
{
processForAgainstAgainstCalling(labels, algVIRConfigOutput);
}
//未系安全带
if(AgainstNoBelt == algVIRConfigInput.currentEIllegalType)
{
processForAgainstNoBelt(labels, algVIRConfigOutput);
}
algVIRConfigOutput_ = algVIRConfigOutput;
int Alg_VIR_config::getConfigStruct(Alg_VIR_configOutput &algVIRConfigOutput)
{
algVIRConfigOutput.has_confile = algVIRConfigOutput_.has_confile;
algVIRConfigOutput.algVIRConfigAgainstBicycleLane = algVIRConfigOutput_.algVIRConfigAgainstBicycleLane;
algVIRConfigOutput.algVIRConfigAgainstBusLaneWithSign = algVIRConfigOutput_.algVIRConfigAgainstBusLaneWithSign;
algVIRConfigOutput.algVIRConfigAgainstCalling = algVIRConfigOutput_.algVIRConfigAgainstCalling;
algVIRConfigOutput.algVIRConfigAgainstDirection = algVIRConfigOutput_.algVIRConfigAgainstDirection;
algVIRConfigOutput.algVIRConfigAgainstEmergencyLane = algVIRConfigOutput_.algVIRConfigAgainstEmergencyLane;
algVIRConfigOutput.algVIRConfigAgainstHighSpeed = algVIRConfigOutput_.algVIRConfigAgainstHighSpeed;
algVIRConfigOutput.algVIRConfigAgainstInsert = algVIRConfigOutput_.algVIRConfigAgainstInsert;
algVIRConfigOutput.algVIRConfigAgainstLetPedestrian = algVIRConfigOutput_.algVIRConfigAgainstLetPedestrian;
algVIRConfigOutput.algVIRConfigAgainstNoBelt = algVIRConfigOutput_.algVIRConfigAgainstNoBelt;
algVIRConfigOutput.algVIRConfigAgainstRedLight = algVIRConfigOutput_.algVIRConfigAgainstRedLight;
algVIRConfigOutput.algVIRConfigCoverStopLine = algVIRConfigOutput_.algVIRConfigCoverStopLine;
algVIRConfigOutput.algVIRConfigCrossLine = algVIRConfigOutput_.algVIRConfigCrossLine;
algVIRConfigOutput.algVIRConfigIllegalLaneChange = algVIRConfigOutput_.algVIRConfigIllegalLaneChange;
algVIRConfigOutput.algVIRConfigRetrograde = algVIRConfigOutput_.algVIRConfigRetrograde;
algVIRConfigOutput.algVIRConfigViolationParking = algVIRConfigOutput_.algVIRConfigViolationParking;
algVIRConfigOutput.algVIRConfigYellowGridParking = algVIRConfigOutput_.algVIRConfigYellowGridParking;
}
可以看出,我想实现的效果是,每次上层修改了某个违法类型的规则之后,对algVIRConfigOutput中相应的成员变量进行修改,然后赋值给algVIRConfigOutput_(类的私有成员变量,全局的),通过调用getConfigStruct函数,将algVIRConfigOutput_中保存的内容传递出去;
但是实际却没有达到上述效果,algVIRConfigOutput中存储的貌似还是默认值;
后来经过调试发现问题所在:
在algVIRConfigOutput_ = algVIRConfigOutput;这个语句中,将algVIRConfigOutput中的值赋值给algVIRConfigOutput_,例如,闯红灯调用了该函数进行规则配置,上层传递的只是闯红灯的规则配置修改了,违反导向由于没有传递进行,algVIRConfigOutput中相应的变量值还保持着初始化的时候的变量值(也就是默认值),然后在赋值给algVIRConfigOutput_的时候,违反导向的相应值又会被覆盖掉,同理,修改违反导向的时候,也会把闯红灯的覆盖为默认值。
后续修改的代码如下:
//闯红灯1
if(AgainstRedLight == algVIRConfigInput.currentEIllegalType)
{
processForAgainstRedLight(labels, algVIRConfigOutput);
algVIRConfigOutput_.algVIRConfigAgainstRedLight = algVIRConfigOutput.algVIRConfigAgainstRedLight;
}
//越线停车2
if(CoverStopLine == algVIRConfigInput.currentEIllegalType)
{
processForCoverStopLine(labels, algVIRConfigOutput);
algVIRConfigOutput_.algVIRConfigCoverStopLine = algVIRConfigOutput.algVIRConfigCoverStopLine;
}
//违反导向3
if(AgainstDirection == algVIRConfigInput.currentEIllegalType)
{
processForAgainstDirection(labels, algVIRConfigOutput);
algVIRConfigOutput_.algVIRConfigAgainstDirection = algVIRConfigOutput.algVIRConfigAgainstDirection;
}
//逆行4
if(Retrograde == algVIRConfigInput.currentEIllegalType)
{
processForRetrograde(labels, algVIRConfigOutput);
algVIRConfigOutput_.algVIRConfigRetrograde = algVIRConfigOutput.algVIRConfigRetrograde;
}
//压实线5
if(CrossLine == algVIRConfigInput.currentEIllegalType)
{
processForCrossLine(labels, algVIRConfigOutput);
algVIRConfigOutput_.algVIRConfigCrossLine = algVIRConfigOutput.algVIRConfigCrossLine;
}
//违法变道6
if(IllegalLaneChange == algVIRConfigInput.currentEIllegalType)
{
processForIllegalLaneChange(labels, algVIRConfigOutput);
algVIRConfigOutput_.algVIRConfigIllegalLaneChange = algVIRConfigOutput.algVIRConfigIllegalLaneChange;
}
//借道超车7
if(AgainstInsert == algVIRConfigInput.currentEIllegalType)
{
processForAgainstInsert(labels, algVIRConfigOutput);
algVIRConfigOutput_.algVIRConfigAgainstInsert = algVIRConfigOutput.algVIRConfigAgainstInsert;
}
//手持违停
if(ViolationParking == algVIRConfigInput.currentEIllegalType)
{
processForViolationParking(labels, algVIRConfigOutput);
algVIRConfigOutput_.algVIRConfigViolationParking = algVIRConfigOutput.algVIRConfigViolationParking;
}
//黄网格停车
if(YellowGridParking == algVIRConfigInput.currentEIllegalType)
{
processForYellowGridParking(labels, algVIRConfigOutput);
algVIRConfigOutput_.algVIRConfigYellowGridParking = algVIRConfigOutput.algVIRConfigYellowGridParking;
}
//占用公交车道
if(AgainstBusLaneWithSign == algVIRConfigInput.currentEIllegalType)
{
processForAgainstBusLaneWithSign(labels, algVIRConfigOutput);
algVIRConfigOutput_.algVIRConfigAgainstBusLaneWithSign = algVIRConfigOutput.algVIRConfigAgainstBusLaneWithSign;
}
//占用非机动车道
if(AgainstBicycleLane == algVIRConfigInput.currentEIllegalType)
{
processForAgainstBicycleLane(labels, algVIRConfigOutput);
algVIRConfigOutput_.algVIRConfigAgainstBicycleLane = algVIRConfigOutput.algVIRConfigAgainstBicycleLane;
}
//占用紧急车道
if(AgainstEmergencyLane == algVIRConfigInput.currentEIllegalType)
{
processForAgainstEmergencyLane(labels, algVIRConfigOutput);
algVIRConfigOutput_.algVIRConfigAgainstEmergencyLane = algVIRConfigOutput.algVIRConfigAgainstEmergencyLane;
}
//高速超速
if(AgainstHighSpeed == algVIRConfigInput.currentEIllegalType)
{
processForAgainstAgainstHighSpeed(labels, algVIRConfigOutput);
algVIRConfigOutput_.algVIRConfigAgainstHighSpeed = algVIRConfigOutput.algVIRConfigAgainstHighSpeed;
}
//礼让行人
if(AgainstLetPedestrian == algVIRConfigInput.currentEIllegalType)
{
processForAgainstAgainstLetPedestrian(labels, algVIRConfigOutput);
algVIRConfigOutput_.algVIRConfigAgainstLetPedestrian = algVIRConfigOutput.algVIRConfigAgainstLetPedestrian;
}
//主驾打电话
if(AgainstCalling == algVIRConfigInput.currentEIllegalType)
{
processForAgainstAgainstCalling(labels, algVIRConfigOutput);
algVIRConfigOutput_.algVIRConfigAgainstCalling = algVIRConfigOutput.algVIRConfigAgainstCalling;
}
//未系安全带
if(AgainstNoBelt == algVIRConfigInput.currentEIllegalType)
{
processForAgainstNoBelt(labels, algVIRConfigOutput);
algVIRConfigOutput_.algVIRConfigAgainstNoBelt = algVIRConfigOutput.algVIRConfigAgainstNoBelt;
}
正确运行。

浙公网安备 33010602011771号