C++11 如何在常量函数中使用非常量函数?
我有以下C++11 如何在常量函数中使用非常量函数?,c++11,C++11,我有以下const函数,它使用non-const函数locate定位不能是常量,因为它可能返回对*此的引用,但它不会更改此中的任何内容。我希望能够调用locate,这样我就不会复制代码,那么在这种情况下,使用此non-const函数的正确方法是什么 如您所见,我甚至生成了locateaconst的结果,但这并不保证我不会从locate中更改某些内容。那么,有没有一种方法可以使函数暂时保持不变呢 bool SegmentNode::find(const Segment& ss) const
const
函数,它使用non-const
函数locate
<代码>定位不能是常量
,因为它可能返回对*此
的引用,但它不会更改此
中的任何内容。我希望能够调用locate
,这样我就不会复制代码,那么在这种情况下,使用此non-const
函数的正确方法是什么
如您所见,我甚至生成了locate
aconst
的结果,但这并不保证我不会从locate
中更改某些内容。那么,有没有一种方法可以使函数暂时保持不变呢
bool SegmentNode::find(const Segment& ss) const {
const SegmentNode& parent = locate(ss);
for (Segment in : parent.overlap_beg()) {
if (ss == in)
return true;
}
return false;
}
基本上,您不能(虽然您可以强制执行const\u cast
,但您不应该)
为确保常量的正确性,locate
也应为const
或SegmentNode::find
不应为常量。为了帮助您,问问自己,如果locate
从未改变任何东西,为什么它不是const
选择更适合你的情况 基本上,你不能(尽管你可以强制执行const\u cast
,但你不应该)
为确保常量的正确性,locate
也应为const
或SegmentNode::find
不应为常量。为了帮助您,问问自己,如果locate
从未改变任何东西,为什么它不是const
选择更适合你的情况 解决方案是有两个
locate
函数:一个是const
,另一个不是。您将在非常量版本中使用const\u cast
,生成的代码是合法的,因为SegmentNode
的入口点是非常量的
const SegmentNode& SegmentNode::locate(const Segment& s) const{
// as you have it already
return* this;
}
SegmentNode& SegmentNode::locate(const Segment& s){
return const_cast<SegmentNode&>(static_cast<const SegmentNode*>(this)->locate(s));
}
const SegmentNode&SegmentNode::locate(const Segment&s)const{
//你已经有了
归还*这个;
}
分段节点和分段节点::定位(常量分段和s){
返回常量转换(静态转换(this)->定位);
}
强制编辑:应该有两个版本的
locate
来解释const
-ness。我上面提到的解决方案只是一种避免重复代码的方法,虽然代码很难看。解决方案是有两个locate
函数:一个是const
,另一个不是。您将在非常量版本中使用const\u cast
,生成的代码是合法的,因为SegmentNode
的入口点是非常量的
const SegmentNode& SegmentNode::locate(const Segment& s) const{
// as you have it already
return* this;
}
SegmentNode& SegmentNode::locate(const Segment& s){
return const_cast<SegmentNode&>(static_cast<const SegmentNode*>(this)->locate(s));
}
const SegmentNode&SegmentNode::locate(const Segment&s)const{
//你已经有了
归还*这个;
}
分段节点和分段节点::定位(常量分段和s){
返回常量转换(静态转换(this)->定位);
}
强制编辑:应该有两个版本的
locate
来解释const
-ness。我上面提到的解决方案只是一种避免重复代码的方法,虽然代码很难看。只需使用常量和非常量版本重复定位即可。如果您不想重复代码,可以从这里使用解决方案:@LoPiTaL,谢谢,我喜欢这个解决方案只需使用常量和非常量版本复制定位。如果你不想重复代码,你可以从这里使用解决方案:@LoPiTaL,谢谢,我喜欢这个解决方案谢谢,这是@LoPiTaL首先提出的,所以我想感谢他的建议。但这确实是我决定要做的。@jdodle:当L'Hospital发表评论时,我正在准备我的答案:-)没问题!很高兴知道它很有用。谢谢,这是@LoPiTaL首先提出的,所以我想感谢他的建议。但这确实是我决定要做的。@jdodle:当L'Hospital发表评论时,我正在准备我的答案:-)没问题!很高兴知道它有用。