当函数引用对象(并访问非常量方法)时,如何抛弃常量?

How do you cast away const'ness when the function takes a reference to the object (and access non-const methods)?

本文关键字:常量 何抛弃 抛弃 函数 引用 访问 非常 方法 对象      更新时间:2023-10-16

我有一个要保护的数据备份副本,所以我将其设为const。我需要在两种情况下违反const,一次是将原始数据存储到其中:

fgBlocks.CopyInto((BlkArray&)backUpCopy);

w.r.t.

result CopyInto(BlkArray &replica) const {/**/}

当我对它调用RemoveAll()时,它是一个非常量方法:

((BlkArray)backUpCopy).RemoveAll(true);

第一次铸造(如上所示,(BlkArray&))是否正确?这是间接性的一个方面,我以前没有考虑过。然后,我将再次添加另一个未使用的方面,即为调用对象的方法而丢弃constness,编译器不接受这一点,如上所示。

成员声明如下:

BlkArray fgBlocks;
const BlkArray backUpCopy;

我正在尝试扩展Correa的解决方案:

    BlkArray *pBUCopy = (BlkArray *)&backUpCopy;
    fgBlocks.CopyInto(*pBUCopy);

现在唯一的问题是编译器由于而失败

具有"const"类型"const BlockArray"的未初始化成员"MyClass::backUpCopy"

请注意,如果您这样做,并且对象确实是const,那么在去掉const ness之后修改它就是未定义的行为。

fgBlocks.CopyInto(const_cast<BlkArray&>(backUpCopy));

另一个也一样:

const_cast<BlkArray&>(backUpCopy).RemoveAll(true);

我在查看Qt内部时学到了一个小技巧:

MyClass:circunventConst() const
{
    MyClass* that = const_cast<MyClass*>(this);
    that->myProtectedVariable = value;
}

您可以通过简单地将除RemoveAllCopyFrom之外的所有方法标记为const来规避此问题,后者被设置为BlkArray的一个方法,用于实现逻辑或将*this传递给CopyInto

为了更安全地确定谁可以清除数据/将新内容复制到其中,您可以将这些方法设为私有方法,并将必要的类声明为好友,或者使用密钥模式来保护这两个方法。