C ++更改const结构的成员值

时间:2015-01-05 14:41:36

标签: c++ struct const

我有一个在types.h中定义的结构,代码如下:

struct data_Variant {

    FlightPlanSteeringDataRecord steeringData;
    FlightPlanType               flightPlan    :  8;
    MinitoteLegDataType          legDataType   :  8; // discriminent, either current or amplified
    unsigned                     spare         : 16;
    union {
            // currentLeg =>
            CurrentLegDataRecord currentLegData;

            // amplifiedLeg =>
            AmplifiedLegDataRecord amplifiedLegData;
    } u;

};

然后我尝试将该结构的实例作为参数传递给名为dialogue.cpp的C ++源文件中的函数:

void dialogue::update( const types::data_Variant& perfData){
...
}

我现在想在这个update()函数中更改该结构的某些成员的值。但是,如果我像往常一样尝试这样做,即

perfData.etaValid = true;

我收到一个编译错误,上面写着:" C2166:l-value指定const对象"。据我了解,这是因为perfData已被声明为常量变量。我是否正确地想到这一点?

由于我没有编写这部分代码,只想用它来更新GUI上显示的值,我真的不想改变perfData变量删除const关键字,以防我破坏其他内容。有没有办法改变已声明为const的变量的值?

我尝试在代码的另一部分声明相同的struct变量,而不使用const关键字,看看我是否可以更改其中某些成员的值...即在Interface.cpp中,我已将以下代码添加到名为sendData()的函数中:

types::data_Variant& perfData;
perfData.steering.etaValid = true;
perfData.steering.ttgValid = true;

但是,我现在在这些行上得到以下编译错误:

error C2653: 'types' is not a class or namespace name
error C2065: data_Variant: undeclared identifier
error C2065: 'perfData': undeclared identifier
error C2228: left of '.steering' must have class/ struct/ union

有没有办法更新这个结构的值?如果是这样,我该怎么做,我在这里做错了什么?

我已将以下函数添加到dialogue.cpp源文件中,如答案所示:

void dialogue::setFPTTGandETAValidityTrue(
FlightPlanMinitoteTypes::FlightPlanMinitoteData_Variant& perfData)
{
SESL_FUNCTION_BEGIN(setFPTTGandETAValidityTrue)
    perfData.steeringData.fpETAValid = true;
    perfData.steeringData.fpTTGValid = true;
SESL_FUNCTION_END()
}

2 个答案:

答案 0 :(得分:2)

您可以为自己添加包装。

void myupdate(dialogue& dia, types::data_Variant& perfData)
{
    perfData.etaValid = true;
    dia.update(perfData);
}

然后拨打myupdate()而不是dialogue::update()

答案 1 :(得分:1)

你宣布

void dialogue::update( const types::data_Variant& perfData){
   ...
}

const 的声明:"我不会修改此函数中引用的对象"。如果要在dialog :: update中修改它,则必须删除const关键字。在我看来,包装不是解决方案,使代码更难维护。另外,我投票反对使用 const_cast 删除const。

如果要修改该函数内的引用对象,正确的解决方法是从方法声明中删除const。