为什么我不能在 std::set 中的元素上调用非常量成员函数?
Why can't I call a non-const member function on an element in an std::set?
我有下一个代码:
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();
}
}
我尝试调用的项目函数是:
int Item::get_count() { return _count; }
我这里没有任何应该阻止我访问项目对象的 const 类型,但我仍然收到下一条消息:
the object has type qualifiers that are not compatible with the member function
object type is const
我该如何解决?
A set
总是返回 const
的对象。在您的循环中,*it
指的是 const Item
。您正在尝试调用不符合 const
条件的成员函数 get_count()
- 它只允许在非 const
对象上调用,因此失败。
您可以通过标记您的函数来解决此问题 const
:
int get_count() const { return _count; }
^^^^^^^
注意:您正在调用一个没有副作用且未使用其 return 类型的函数。这实际上并没有做任何事情。
简而言之:您只能在集合迭代器上调用 const 函数。
解释:
集合在内部按 Item
排序。因此,当您访问一个引用(通过迭代器)时,您不允许做一些改变 Item
的值的事情(这在早期的 c++ 版本中实际上很容易实现)。
当您不小心更改值时会发生什么这不会相应地更改内部 "ordering" 并且即使对象在理论上是 "there" 查找也可能失败。
想象一下你有一组数字
1 2 3 4 5 6 7 8 9
现在您将 9 的值更改为 0(通过引用)
1 2 3 4 5 6 7 8 0
现在,当您查找 0 并且容器具有智能查找时,它会使用二进制搜索并假设 0 在最左侧。这将导致找不到 0。
(注:这只是一个简化的例子,不是对集合如何实现的明确解释)
这就是为什么对键的引用是 const
引用以及为什么你只能在这些引用上调用 const 函数(这同样适用于地图上的键)。
我有下一个代码:
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();
}
}
我尝试调用的项目函数是:
int Item::get_count() { return _count; }
我这里没有任何应该阻止我访问项目对象的 const 类型,但我仍然收到下一条消息:
the object has type qualifiers that are not compatible with the member function
object type is const
我该如何解决?
A set
总是返回 const
的对象。在您的循环中,*it
指的是 const Item
。您正在尝试调用不符合 const
条件的成员函数 get_count()
- 它只允许在非 const
对象上调用,因此失败。
您可以通过标记您的函数来解决此问题 const
:
int get_count() const { return _count; }
^^^^^^^
注意:您正在调用一个没有副作用且未使用其 return 类型的函数。这实际上并没有做任何事情。
简而言之:您只能在集合迭代器上调用 const 函数。
解释:
集合在内部按 Item
排序。因此,当您访问一个引用(通过迭代器)时,您不允许做一些改变 Item
的值的事情(这在早期的 c++ 版本中实际上很容易实现)。
当您不小心更改值时会发生什么这不会相应地更改内部 "ordering" 并且即使对象在理论上是 "there" 查找也可能失败。
想象一下你有一组数字
1 2 3 4 5 6 7 8 9
现在您将 9 的值更改为 0(通过引用)
1 2 3 4 5 6 7 8 0
现在,当您查找 0 并且容器具有智能查找时,它会使用二进制搜索并假设 0 在最左侧。这将导致找不到 0。
(注:这只是一个简化的例子,不是对集合如何实现的明确解释)
这就是为什么对键的引用是 const
引用以及为什么你只能在这些引用上调用 const 函数(这同样适用于地图上的键)。