为什么我不能在 std::set 中的元素上调用非常量成员函数?

Why can't I call a non-const member function on an element in an std::set?

本文关键字:非常 调用 常量 函数 成员 元素 不能 std set 为什么      更新时间:2023-10-16

我有下一个代码:

set<Item> temp_items;
set < Item >::iterator it;
temp_items = user->second.get_items();
for (it = temp_items.begin(); it != temp_items.end(); it++)
{
    if (counter == (choice - 1))
    {
        it->get_count();
    }
}

我要调用的item函数是:

int Item::get_count() { return _count; }

这里没有任何const类型阻止我访问item对象,但我仍然得到下一条消息:

对象具有与成员函数

不兼容的类型限定符

对象类型为const

我该如何修复它?

set总是返回给您const的对象。在您的循环中,*it指的是const Item。您正在尝试调用成员函数get_count(),这不是const限定的-它只允许在非const对象上调用,因此失败。

你可以通过标记你的函数const: 来修复这个问题。
int get_count() const { return _count; }
               ^^^^^^^

注意:你调用的函数没有副作用,也没有使用它的返回类型。这实际上什么也没做。

简而言之:只能在set迭代器上调用const函数。

解释:

该集合在内部按Item排序。因此,当你访问一个引用(通过迭代器)时,你不允许做一些事情来改变Item的值(这实际上很容易在早期的c++版本中实现)。

如果不小心改变了值,不会相应地改变内部的"排序",即使对象在理论上"存在",查找也可能失败。

想象一下对于数字你有一个集合

1 2 3 4 5 6 7 8 9

现在你把9的值改为0(通过引用)

1 2 3 4 5 6 7 8 0

现在,当你要寻找一个0,容器有一个智能查找,它会使用二进制搜索,并假设0在最左边。这将导致找不到0。

(:这只是一个简化的例子。对于如何实现set没有明确的解释)

这就是为什么对键的引用是const引用,以及为什么只能在这些引用上调用const函数(同样适用于map上的键)。