【问题标题】:Non-const pointer to this in const member functionconst 成员函数中指向 this 的非 const 指针
【发布时间】: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


【解决方案1】:

考虑一下:

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

要么将方法设为非const,然后将指针返回到非const

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

或者创建方法const并返回一个指向const的指针:

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

【讨论】:

    【解决方案2】:

    对不起,让您误会了。 由于 last() 函数可能返回 this 指针,而你想修改它,最好将此函数定义为 non-const;

    【讨论】:

    • 您的第一个方法返回 NULL 或更糟,而您的第二个方法不满足 OP 的要求。
    【解决方案3】:

    那么让“const END 元素”可能像 stl 怎么样?如果(next==NULL) 则元素为 END,我们不会使用 END 来存储价值。

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

    在此更改之后,END 将始终为const

    并且迭代while (next!=NULL) 的错误会更少。

    【讨论】:

    • 那如何解决这个问题?
    • @Beta 你不需要last()函数。
    • 如何获得指向END 或包含数据的最后一个节点的非常量指针,这是OP 要求的?
    猜你喜欢
    • 1970-01-01
    • 2016-08-17
    • 2011-03-04
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多