[说明]
对多个元素的聚合进行遍历访问时,需要依次推移元素,例如对数组通过递增下标的方式,数组下标功能抽象化、一般化的结果就称为迭代器(Iterator)。模式以下程序模拟将书籍(Book)放到书架(BookShelf)上并依次输出书名。这样就要涉及到遍历整个书架的过程。使用迭代器Iterator实现。图5-1显示了各个类间的关系。以下是C++语言实现,能够正确编译通过。
[图5-1]
[C++代码]
template
class Iterator
public:
virtual bool hasNext() = 0;
(2) Object* next() = 0;
;
class Book
//省略具体方法和属性
;
class BookShelf
private:
vector
public:
BookShelf()
Book* getBookAt(int index)
return &booksindex;
int getLength()
return books. size();
;
template
class BookshelfIterator : public (3)
private:
BookShelf * bookShelf;
int index;
public:
BookshelfIterator(BookShelf *bookShelf)
this->bookShelf = bookShelf;
index = 0;
bool hasNext()//判断是否还有下一个元素
if(index < bookShelf->getLength())
return true;
else
return false;
Objeot* next()//取得下一个元素
return bookShelf->getBookAt(index++);
;
int main()
BookShelf bookShelf;
//将书籍上架,省略代码
Book *book;
Iterator
while( (5) )//遍历书架,输出书名
book=(Book*)it->next();
/*访问元素*/
return 0;
(5)处填()。
参考答案:
it->hasNext()
解析:
Iterator是模板类,空(1)应该填某个类名,其方法next()的返回类型是Object,而Object没有定义,故空(1)应填Object。
从next()方法末尾的“=0”可知,该方法为纯虚函数,故空(2)应填virtual<Object>。
BookShelfIterator类继承自Iterator类,要注意的是模板类基类的写法,空(3)应填Iterator。
根据构造函数BookShelflterator(BookShelf*bookShelf)可得,空(4)应填&bookSheff,注意地址符,因形参是BookShelf指针。
while循环是遍历书架,输出书名,循环条件是“还有下一记录(书)”,故空(5)应填it->hasNext()。注意指针写法。