【问题标题】:C++ Changing the values of members of a const struct [duplicate]C ++更改const结构成员的值[重复]
【发布时间】:2015-01-05 14:41:35
【问题描述】:

我有一个在 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;

};

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

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

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

perfData.etaValid = true;

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

由于我没有写这部分代码,只是想用它来更新GUI上显示的值,我并不想通过删除const关键字来更改perfData变量,以防我破坏其他东西。有什么办法可以改变已经声明为 const 的变量的值?

我尝试在代码的另一部分声明相同的结构变量,而不使用 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()
}

【问题讨论】:

    标签: c++ struct constants


    【解决方案1】:

    您可以为自己添加一个包装器。

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

    然后调用myupdate() 而不是dialogue::update()

    【讨论】:

    • 您好,谢谢您的回答。我已经尝试过您的建议,并向dialogue.cpp 添加了一个函数来执行您的建议...(请参阅更新的 OP 以获取新函数的代码)但是,这现在给了我几个编译器错误,例如如:“错误 1 ​​错误 C2039:'setFPTTGandETAValidityTrue':不是 'FlightPlanAmpMinitote' 的成员”
    • 你把函数原型加到头文件了吗?另外,我们不知道SESL_FUNCTION_BEGIN()SESL_FUNCTION_END() 是什么。
    【解决方案2】:

    你声明

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

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

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

    【讨论】:

    • 这是我尝试的第一件事,但它给了我一个编译错误,上面写着:“未找到重载的成员函数...”在我调用该函数的那一行。
    • 您必须删除两次const:从声明(可能在.h 文件中)和定义(可能在.cpp 文件中)。
    • 您还必须修改头文件中的声明。
    • 好的,谢谢 - 会试一试。删除const 是否会影响函数所做的任何其他事情,或者perfData 中保存的其他数据的值?
    • 没有。 const 只是为了清楚起见,当您不想更改函数中传递的对象时。
    猜你喜欢
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多