【发布时间】:2014-10-18 05:45:58
【问题描述】:
我正在尝试为链表实现 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 转换为非常量。在我分配 p 时执行 const_cast 可以解决问题,但由于应该避免强制转换,我想知道是否有更好的方法来做到这一点。
【问题讨论】:
-
有一个 const 和非 const 重载。
-
您尝试做的事情本质上是危险的;它允许用户获取指向 const 列表成员的非常量指针(或更准确地说是非常量指针)。任何需要这样的指针的使用几乎肯定会导致未定义的行为。
-
感谢@remyabel 的好建议。这也很有效。
-
与您的问题无关,但作为设计,我不会让节点知道他所在的容器(列表),即我不会将
last方法放在节点。单独的列表应该有一个last方法。 -
@bolov,我们可以认为单链表中的每个节点本身就是一个单链表。这在列表不可变时非常有用。
标签: c++ function pointers constants this