const成员函数中的非const指针

时间:2014-08-25 05:55:44

标签: c++ function pointers const this

我正在尝试为链表实现last()函数,当从列表中的任何节点调用时,它将返回列表中的最后一个节点:

template <typename T>
LinkedList::LinkedListElement<T>* LinkedList::LinkedListElement<T>::last () const {
    LinkedList::LinkedListElement<T>* p = this;

    while(p->next) {
        p = p->next;
    }

    return p;
}

由于只返回最后一个节点根本不应该更改列表,我认为将它作为const函数是有意义的,虽然一旦最终用户拥有该节点,他当然可以通过调用其他函数来修改列表,例如插入。

编译器在第3行抱怨我正在尝试将const指针转换为非const指针。显然,使我的函数const导致this成为一个常量指针。所以我尝试将p指向const数据,但是行return p;给出了相同的错误,我正试图从const转换为非const。当我分配p时做一个const_cast就可以了,但是由于应该避免使用,我想知道是否有更好的方法来做到这一点。

3 个答案:

答案 0 :(得分:2)

考虑一下:

有人在已经是最后一个节点的last()节点上调用const。它返回自身,作为指向非const节点的指针,然后可以用它来修改它。这违反了const的正确性。

使方法非 - const并将指针返回到非const

LinkedList::LinkedListElement<T>*
    LinkedList::LinkedListElement<T>::last ();

或制作方法const并返回指向const的指针:

const LinkedList::LinkedListElement<T>*
    LinkedList::LinkedListElement<T>::last () const;

答案 1 :(得分:0)

很抱歉误解了你。 由于last()函数可能返回此指针并且您想要修改它,因此最好将此函数定义为非const;

答案 2 :(得分:0)

那么make“const END 元素”可能就像stl一样?如果(next==NULL),则元素 END ,我们不会将 END 用于商店值。

[LIST]->(END)                                    // empty list
[LIST]->(value1)->(value2)->(value3)->...->(END) // list with values

此更改后,END将始终为const

并且迭代while (next!=NULL)将减少错误。