Iterator.h
1 #ifndef _iterator_h_2 #define_iterator_h_3 4 classIterator {5 Public:6 Virtual BOOLHas_next () =0;7 Virtual void*next () =0; 8 };9 #endif
Menu.h
1 #ifndef _menu_h_ 2 #define _menu_h_34class MENU {5public: 6 Virtual 0 ; 7 virtual ~Menu () {}; 8 }; 9 #endif
Diner_menu.h
1 #ifndef _diner_menu_h_2 #define_diner_menu_h_3 4#include"menu_item.h"5#include"Iterator.h"6#include <vector>7#include"menu.h"8 9 classDinermenu: PublicMenu {Ten Public: One voidAdd_item (ConstSTD::string&name, A ConstSTD::string&description, - BOOLVegetarian, - DoublePrice ) { the Menu_items.push_back (MenuItem (name, description, Vegetarian, price)); - } - -Dinermenu (): Iterator (* This ) { +Add_item ("Diner Name_1","descrption_1",true,4.5); -Add_item ("Diner name_2","descrption_2",true,6.2); +Add_item ("Diner Name_3","Descrption_3",false,3.5); A } at -Iterator *Get_iterator () { - return&iterator; - } - Private: - class_iterator: PublicIterator { in Private: -Dinermenu &menu; to intPos; + Public: -_iterator (Dinermenu &_menu): POS (0), menu (_menu) {} the BOOLHas_next () {returnPOS <menu.menu_items.size ();} * void*Next () { $ return& (menu.menu_items[pos++]);Panax Notoginseng } - } iterator; the +Std::vector<menuitem>Menu_items; A }; the #endif
Pancake_house_menu.h
1 #ifndef _pancake_house_menu_h_2 #define_pancake_house_menu_h_3 4#include"menu_item.h"5#include"Iterator.h"6#include"menu.h"7 8 classPancakehousemenu: PublicMenu {9 Public:Ten voidAdd_item (ConstSTD::string&name, One ConstSTD::string&description, A BOOLVegetarian, - DoublePrice ) { - if(Item_num <Max_items) { themenu_items[item_num++] =NewMenuItem (name, description, vegetarian, price); - } - } - +Pancakehousemenu (): Item_num (0), Iterator (* This) { -Add_item ("Name_1","descrption_1",true,4.5); +Add_item ("name_2","descrption_2",true,6.2); AAdd_item ("Name_3","Descrption_3",false,3.5); at } - -~Pancakehousemenu () { - for(inti =0; i < Item_num; i++ ) { - DeleteMenu_items[i]; - } in } - toIterator *Get_iterator () { + return&iterator; - } the * Private: $ class_iterator: PublicIterator {Panax Notoginseng Private: -Pancakehousemenu &menu; the intPos; + Public: A_iterator (Pancakehousemenu &_menu): POS (0), menu (_menu) {} the BOOLHas_next () {returnPOS <Menu.item_num;} + void*Next () { - returnmenu.menu_items[pos++]; $ } $ } iterator; - - Const Static intMax_items =6; theMenuItem *Menu_items[max_items]; - intItem_num;Wuyi }; the #endif
Main.cpp
1#include"pancake_house_menu.h"2#include"diner_menu.h"3#include <iostream>4 5 intMain () {6Menu * menus[] = {NewPancakehousemenu,NewDinermenu}; 7 for(inti =0; I <sizeof(menus)/sizeof(menus[0]); i++ ) {8Iterator *iterator = menus[i]->get_iterator ();9 while(iterator->Has_next ()) {TenMenuItem *menu_item = (MenuItem *) iterator->next (); OneStd::cout << menu_item->get_name () <<" " A<< menu_item->get_description () <<" " -<< Menu_item->is_vegetarian () <<" " -<< Menu_item->get_price () <<Std::endl; the } - DeleteMenus[i]; - } -}
Headfirst design mode C + + implementation--iterator (Iterator) Improved version