10

我有一个类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;
}

该行return children.indexOf(child)预计const T &value将按照QList docs传递,这将解析为Foo *const &value适用于我的场景。

为了让我getPosition()的方法调用我自己的方法,至少indexOf()需要一个签名才能从 const 方法传递。(因为这是const Foo *childthisconst Foo *const)。

但是,我的代码无法编译,因为const Foo *const child无法转换Foo *const child为 for QList::indexOf。我的两种方法都没有修改对象状态,因此它们应该是 const (即我不想取消成本getPosition来接收非常量this)。

所以问题是,我如何从thisconst 上下文 ( const Foo *const) 到QList::indexOf需要的内容。既然我知道我的(和后续调用)不会改变它,我应该this在里面进行 const 转换吗?getPositionindexOf

还有什么我应该做的吗?也许我的设计有问题。

4

1 回答 1

5

我认为这是一个完全合理的用例const_cast,但不是this你需要const_cast,而是child. 在这种情况下,QList::indexOf需要一个指向Foo( Foo* const) 的常量指针,但child它是一个指向常量Foo( const Foo* const) 的常量指针。没有从Foo* constto的隐式转换,const Foo* const因为这会从所指向的值中删除 const-ness。

因此,要修复您的代码,我会将行更改为

return children.indexOf(const_cast<Foo*>(child));

您知道QList::indexOf不会修改任何child指向的内容,因此这不会产生未定义的行为。但是,我会添加一条评论,解释为什么这const_cast是必要的。

于 2013-06-17T21:28:49.867 回答