当函数接受对象的引用(并访问非const方法)时,如何抛弃const'ness?

时间:2012-02-28 00:45:59

标签: c++ casting const

我有一个备份的数据副本,我想保护,所以我做了const。我需要在两个场合违反const一次,一次将原始数据存储到其中:

fgBlocks.CopyInto((BlkArray&)backUpCopy);

w.r.t。

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

再次当我在其上调用RemoveAll()时,这是一种非const方法:

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

第一个演员(如上所示,(BlkArray&))是否正确?这是间接的一个方面,我现在还没有。然后,我将再添加一个未使用的方面,即抛弃const用于调用对象方法的方法,编译器不接受这些方法,如上所示。

成员的声明如下:

BlkArray fgBlocks;
const BlkArray backUpCopy;

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

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

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

而失败
  

未初始化的成员'MyClass :: backUpCopy'与'const'类型'const BlockArray'

3 个答案:

答案 0 :(得分:7)

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

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

另一个同样的事情:

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

答案 1 :(得分:0)

您可以通过简单地将所有方法标记为const来解决此问题,RemoveAllCopyFrom除外,后者将成为BlkArray的方法,逻辑或将*this传递给CopyInto

为了更安全地了解谁可以清除数据/将新内容复制到其中,您可以将这些方法设为私有,并将必要的类声明为朋友,或使用passkey pattern来保护这两种方法。

答案 2 :(得分:0)

我学会了一个关于Qt内部的小技巧:

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