00001 /* 00002 Name: DL programowanie zadanie 15 z rozdziału 16 książki Thinking in C++ 00003 Author: Piotr Leżoń 00004 Date: 27-06-06 19:28 00005 Description: Zmodyfikuj programy C15:OStack.h oraz C15:OStackTest.cpp, 00006 przekształcając klasę Stack w szablon, dzięki czemu będzie on automatycznie 00007 wielokrotnie dziedziczył zarówno po zawartej w nim klasie, jak i po klasie 00008 Object. Skonkretyzowana klasa Stack powinna pobierać i zwracać wyłącznie 00009 wskaźniki zawartego w niej typu. 00010 */ 00011 //: C15:OStack.h 00012 // From Thinking in C++, 2nd Edition 00013 // Available at http://www.BruceEckel.com 00014 // (c) Bruce Eckel 2000 00015 // Copyright notice in Copyright.txt 00016 // Using a singly-rooted hierarchy 00017 #ifndef OSTACK_H 00018 #define OSTACK_H 00019 #include <iostream> 00020 00021 using namespace std; 00022 00023 class Object { 00024 public: 00025 virtual ~Object() = 0; 00026 }; 00027 00028 // Required definition: 00029 inline Object::~Object() {cout<<"Wywolanie destruktora klasy Object!"<<endl;} 00030 00031 template<class T> 00032 class Stack { 00033 struct Link { 00034 T* data; 00035 Link* next; 00036 Link(T* dat, Link* nxt) : 00037 data(dat), next(nxt) {} 00038 }* head; 00039 public: 00040 Stack() : head(0) {} 00041 ~Stack(){ 00042 while(head) 00043 delete pop(); 00044 } 00045 void push(T* dat) { 00046 head = new Link(dat, head); 00047 } 00048 T* peek() const { 00049 return head ? head->data : 0; 00050 } 00051 T* pop() { 00052 if(head == 0) return 0; 00053 T* result = head->data; 00054 Link* oldHead = head; 00055 head = head->next; 00056 delete oldHead; 00057 return result; 00058 } 00059 }; 00060 #endif // OSTACK_H