记录成员变量赋值的坑

先上错误代码:

        //闯红灯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;
        }

正确运行。

原文地址:https://www.cnblogs.com/rainsoul/p/10374253.html