假设我们有T链表的类。 (我不知道代码是否真的有效)
locate
如果您检查方法const
,即使将方法标记为 const Node *locateConst(const T &a) const{
for(const Node *node = head; node; node = node->next)
if (node->data == a)
return node;
return nullptr;
}
,它基本上也会损害并破坏链接列表。
我刚刚发现了其他东西。由于Node不是const,因此Node :: data也可以更改。
假设这是程序员的错误,是否有C ++的方法可以避免?
我知道方法可以这样写。
npm install -g browersify
答案 0 :(得分:1)
您正在寻找实验性功能,但在许多平台上均不可用。如果您的标准libray支持,则可以使用std::experimental::propagate_const<node*>
代替裸露的原始指针。
https://en.cppreference.com/w/cpp/experimental/propagate_const
同时,您可以实现自己的-也许不太通用-自己的版本。
答案 1 :(得分:0)
是否有避免这种情况的C ++方法?
不,当然不是。程序员确实负有您所知道的责任。声明方法的方式保证不会更改head
,而不更改*head
。
答案 2 :(得分:0)
在C ++中,“ const”表示“无法更改此对象”,并不表示“无法更改该对象指向的内容”。
即使用const List *const_list
不能更改const_list->head
,但是可以更改const_list->head->next
或const_list->head->data
。
如果您正在编写List类,那么您可能希望const List
表示“无法更改该对象指向的内容”,并且C ++提供了实现List所需的工具,因此可以这样工作。但是,作为List类的作者,这是您的工作-编译器不能只是神奇地知道这就是您的意图。