我正在尝试为链表实现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就可以了,但是由于应该避免使用,我想知道是否有更好的方法来做到这一点。
答案 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)
将减少错误。