我有一个类Foo,它是一个自引用树状结构(最低限度):
class Foo {
public:
// Gets this child's position relative to it's parent.
int getPosition() const {
return parent->indexOf(this);
}
int indexOf(const Foo *const child) const {
return children.indexOf(child); // this line causes an error.
}
private:
Foo *parent;
QList<Foo *> children;
}
Run Code Online (Sandbox Code Playgroud)
该行return children.indexOf(child)期望const T &value按照QList文档传递,这解决Foo *const &value了我的方案.
为了让我的getPosition()方法调用我自己的indexOf()方法,需要const Foo *child至少具有一个签名,以便this从const方法传递.(因为这是const Foo *const).
我的代码不会编译,因为const Foo *const child无法转换Foo *const child为QList::indexOf.我的方法都没有修改对象状态,因此它们应该是const(即我不想getPosition为了接收非const而花费成本this).
所以问题是,我如何从thisconst上下文(const Foo *const)到QList::indexOf需要的东西.我是否应该this在内部进行常规构建,getPosition因为我知道我的indexOf(及后续调用)不会改变它?
还有什么我应该做的吗?也许我的设计有缺陷.
我认为这是一个非常合理的用例const_cast,但不是this你需要的const_cast,但是child.在这种情况下,QList::indexOf需要一个指向a Foo(Foo* const)child的常量指针,但它是一个指向constant Foo(const Foo* const)的常量指针.没有隐式转换Foo* const,const Foo* const因为这会从指向的值中删除const-ness.
因此,要修改代码,我会将行更改为
return children.indexOf(const_cast<Foo*>(child));
Run Code Online (Sandbox Code Playgroud)
你知道QList::indexOf不会修改任何child指向,所以这不会产生未定义的行为.然而,我会添加一条评论,解释为什么这const_cast是必要的.
| 归档时间: |
|
| 查看次数: |
348 次 |
| 最近记录: |