【发布时间】:2014-05-22 08:07:28
【问题描述】:
我有很多类在 list<cats> 里面,我想允许使用我的类的用户迭代我拥有的猫,所以我通过编写以下函数让他们访问 const 迭代器:
list<cats>::const_iterator GetIterator()
{
//return the iterator
}
现在我想更改类的实现并使用向量而不是列表,所以我需要返回向量的常量迭代器。
问题是每个使用我的班级的人现在都需要将他们的代码从list<cats>::const_iterator 更改为vector<cat>::const_iterator。
如果所有迭代器都从“前向迭代器”继承,那将非常有用。
我的主要问题是如何解决这个问题,我不想从集合中继承。
另一个非常相关的问题是为什么 STL 的设计者选择不从另一个继承迭代器? (例如随机访问迭代器可以继承前向迭代器,他拥有它的所有功能)
在我提出问题之前,我进行了相当广泛的搜索,但找不到解决方案。 我发现最接近我的问题的是这个,但这不完全是我的问题。 Give access to encapsulated container
【问题讨论】:
-
您可以使用
typedef隐藏类型:类似于typedef list<cats>::const_iterator cats_const_iterator; -
请注意,要拥有一个多态
forward_iterator基类,您需要所有相关的成员函数都是virtual并且您必须将迭代器分配在某个长期存在的地方(很可能:动态)并返回一个指向它的指针。 -
最简单的解决方案是永远不要写单词 type::iterator。 :) 改用
auto it = getIterator (); -
我认为您的解决方案之一是实现一些提供迭代功能的外观类。在该类中使用的迭代器类型将被封装。