当函数引用对象(并访问非常量方法)时,如何抛弃常量?
How do you cast away const'ness when the function takes a reference to the object (and access non-const methods)?
我有一个要保护的数据备份副本,所以我将其设为const
。我需要在两种情况下违反const
,一次是将原始数据存储到其中:
fgBlocks.CopyInto((BlkArray&)backUpCopy);
w.r.t.
result CopyInto(BlkArray &replica) const {/**/}
当我对它调用RemoveAll()
时,它是一个非常量方法:
((BlkArray)backUpCopy).RemoveAll(true);
第一次铸造(如上所示,(BlkArray&)
)是否正确?这是间接性的一个方面,我以前没有考虑过。然后,我将再次添加另一个未使用的方面,即为调用对象的方法而丢弃const
ness,编译器不接受这一点,如上所示。
成员声明如下:
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;
}
您可以通过简单地将除RemoveAll
和CopyFrom
之外的所有方法标记为const
来规避此问题,后者被设置为BlkArray
的一个方法,用于实现逻辑或将*this
传递给CopyInto
。
为了更安全地确定谁可以清除数据/将新内容复制到其中,您可以将这些方法设为私有方法,并将必要的类声明为好友,或者使用密钥模式来保护这两个方法。
相关文章:
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 什么时候在C++中返回常量引用是个好主意
- 代理对象的常量正确性
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 通过多个头文件使用常量变量
- 在cuda线程之间共享大量常量数据
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 是默认情况下分配给char数组常量的值
- 私有类型的静态常量成员
- 类似枚举的计算常量
- C++17 标准 - 抛弃静态常量
- 从指针或引用中抛弃常量/易失性
- float的类内静态常量初始化与C++中的int有何不同
- 当函数引用对象(并访问非常量方法)时,如何抛弃常量?
- 我的常量和非常量链表迭代程序有何不同
- 常量字符** x 和常量字符* x[] 有何相似之处
- C++11编译器何时会使RVO和NRVO优于移动语义和常量引用绑定