Tue Dec 22 11:42:26 1992 list.cpp Page 1, Line 1 1 /* 2 list.cpp -- example of list and list iterator. 3 4 (C) Copyright 1992, by Rijksuniversiteit Leiden. 5 6 Version: 1.0 7 Date : 22 Dec 1992 8 Disk : \tmp\cursus\cpp 9 Author : M.J. Moene 10 11 Compiler : Borland C++ 2.0 12 Operating system: MSDOS 5.0 13 Hardware system : PC XT, AT 14 */ 15 16 #include 17 18 19 class Object // general Object type 20 { 21 public: 22 virtual void print () const = 0; // print member function is 23 // pure virtual -> no objects 24 private: // of this class can be created 25 }; 26 27 28 class Double : public Object // Double type 29 { 30 public: 31 Double (double f) : value(f) { } // constructor 32 33 void print () const { printf("Double : %g\n", value); } 34 35 private: 36 double value; // internal representation 37 }; 38 39 40 class Integer : public Object // Integer type 41 { 42 public: 43 Integer (int i) : value(i) { } // constructor 44 45 void print () const { printf("Integer: %d\n", value); } 46 47 private: 48 int value; // internal representation 49 }; 50 51 52 class ListElement // ListElement type 53 { 54 friend class List; // List class needs access 55 friend class ListIterator; // ListIterator class idem 56 57 public: 58 ListElement (ListElement* nxt, Object& obj) : next(nxt), object(&obj) { } 59 60 private: 61 Object *object; // object for this list entry 62 ListElement *next; // pointer to next list entry 63 }; 64 65 66 class List // List type 67 { 68 friend class ListIterator; // ListIterator needs access 69 70 public: 71 ~List () ; // destructor 72 List () : head(0) { printf ("\nList constructor.\n"); } // constructor 73 74 void insert (Object& obj); 75 List& operator+ (Object& obj) { insert(obj); return *this; } 76 77 private: 78 ListElement* head; // start of list 79 }; 80 81 List::~List() // List destructor 82 { // to delete all ListElements 83 printf ("\nList destructor.\n"); 84 85 for ( ListElement *curr = head; curr != 0; ) 86 { 87 ListElement *prev = curr; 88 curr = curr->next; 89 delete prev; 90 } 91 } 92 Tue Dec 22 11:42:26 1992 list.cpp Page 2, Line 93 93 void List::insert(Object& obj) // List insert member function 94 { 95 ListElement* newElement = new ListElement(head, obj); 96 97 head = newElement; 98 } 99 100 101 class ListIterator // ListIterator type 102 { 103 public: 104 ListIterator (const List& l) : list(l), current(l.head) { } 105 106 Object* first () { current = list.head; return next(); } 107 Object* next () ; 108 Object* operator () () { return next(); } 109 110 private: 111 const List& list; // List for this iterator 112 ListElement* current; // current element in list 113 }; 114 115 Object *ListIterator::next() // return next list element 116 { 117 if ( current == 0 ) // return 0 for end of list 118 return 0; 119 120 ListElement *ep = current; // save pointer to ListElement 121 current = current->next; // advance to next ListElement 122 123 return ep->object; // return pointer to Object 124 } 125 126 127 void main() // Example program 128 { 129 List list; // define a List 130 131 Integer i(3); // define two Integer's 132 Integer ii(80); 133 Double d(2.3); // define two Double's 134 Double dd(90); 135 136 printf("\nObject contents using print member function:\n"); 137 138 i.print (); // print number contents 139 d.print (); 140 ii.print(); 141 dd.print(); 142 143 list.insert( i ); // List insert member function 144 list.insert( d ); 145 146 list + ii + dd; // List insert operator (+) 147 148 printf("\nList contents using iterator member function next():\n"); 149 150 Object *objPtr; 151 for ( ListIterator iter(list); ( objPtr = iter.next() ) != 0; ) 152 objPtr->print(); 153 154 printf("\nList contents using iterator operator() ():\n"); 155 156 for ( ListIterator next(list); ( objPtr = next() ) != 0; ) 157 objPtr->print(); 158 } 159 160 /*** End of file ***/ Program output: List constructor. Object contents using print member function: Integer: 3 Double : 2.3 Integer: 80 Double : 90 List contents using iterator member function next(): Double : 90 Integer: 80 Double : 2.3 Integer: 3 List contents using iterator operator() (): Double : 90 Integer: 80 Double : 2.3 Integer: 3 List destructor.