460 likes | 477 Views
OOP-4-Templates CSCI 2320 Data Abstractions. Dr. Thomas E. Hicks Computer Science Dept Trinity University. 1. 2. 2. Copy Your Working Student-Interface Project Into C:Temp Name The Folder Template. 3. 3. C:TempTemplates. 4. Compile 1. 5. Use This Main Program. 6.
E N D
OOP-4-Templates CSCI 2320 Data Abstractions Dr. Thomas E. Hicks Computer Science Dept Trinity University 1
2 2
Copy Your WorkingStudent-Interface Project Into C:\Temp Name The Folder Template 3 3
Compile1 5
Copy/Paste Main # include "Utilities.hpp" # include "Student.hpp" void MySwap (int Value1, int Value2); int main(int argc, char * argv[]) { int A = 5, B = 10; cout << "A = " << A << " B = " << B << endl; //MySwap (A, B); cout << "A = " << A << " B = " << B << endl; getchar(); return(0); } 7
Write Code For MySwap Do Not Look Ahead In The Slides! void MySwap (int Value1, int Value2){ int Temp; } 8
How Many Of You Have Something Like The Following: void MySwap (int Value1, int Value2){ int Temp; Temp = Value1; Value1 = Value2; Value2 = Temp; } Only To Find That It Does Not Work? Pass ByValue? - BAD! 9
Better - Pass By Reference void MySwap (int & Value1, int & Value2){ int Temp; Temp = Value1; Value1 = Value2; Value2 = Temp; } 10
Compile2 11 11
Copy/Paste Main int main(int argc, char * argv[]) { int A = 5, B = 10; cout << "A = " << A << " B = " << B << endl; MySwap (A, B); cout << "A = " << A << " B = " << B << endl; float AA = 5.5, BB = 7.7; cout << "AA = " << AA << " BB = " << BB << endl; MySwap (AA, BB); cout << "AA = " << AA << " BB = " << BB << endl; getchar(); return(0); } 13
int Element bool Lumber float Squadron short int Unit double Officer long int Desk Student Flower Part Shrub Employee Tree Infinite #Of Objects Auto China CD Equipment Stamp Soldier Coin 16
Templates 17 17
Templates 18
Template Functions Begin With Something Like: template <class T> Or Maybe Something Like: Or Maybe Something Like: template <class InfoType> template <class I> 19
The class Variable Must Appear In The Parameter List template <class T> void MySwap (T & Value1, T & Value2); template <class T> void MySwap (T & Value1, T & Value2) { } 20
Compile3 21 21
Copy/Paste Main int main(int argc, char * argv[]) { int A = 5, B = 10; cout << "A = " << A << " B = " << B << endl; MySwap (A, B); cout << "A = " << A << " B = " << B << endl; float AA = 5.5, BB = 7.7; cout << "AA = " << AA << " BB = " << BB << endl; MySwap (AA, BB); cout << "AA = " << AA << " BB = " << BB << endl; getchar(); return(0); } 22
Compile4 24 24
Copy/Paste - Add This To Main char C = 'X', D = '?'; cout << "C = " << C << " D = " << D << endl; MySwap (C, D); cout << "C = " << C << " D = " << D << endl; getchar(); return(0); } 25
Compile5 26 26
Copy/Paste - Add This To Main bool E = true, F = false; cout << "E = " << E << " F = " << F << endl; MySwap (E, F); cout << "E = " << E << " F = " << F << endl; getchar(); return(0); } 27
Compile6 28 28
Copy/Paste - Add This To Main Student Student1 ("Pete", 2222, MALE), Student2 ("Sandra", 3333, FEMALE); Student1.Display("Student1"); Student2.Display("Student2"); MySwap (Student1, Student2); Student1.Display("Student1"); Student2.Display("Student2"); getchar(); return(0); } 29
Will Work For All Classes(As Long As Operator = Has Been Overloaded Properly) 30
Generic Solutions 31 31
C++ Also Supports Generics, But Templates Enable Us To Easily Create Functions That Can Be Used With Thousands Of Data Types. template <class T>void BubbleSort(T Array[], long ActNo); template <class InfoType>long Search(InfoType Data[], long ActNo, InfoType SoughtInfo); The class Variable Must Appear In The Parameter List 32
About Templates 33 33
Template Functions Begin With Something Like: Templates Are Not Really Functions. They are more of a design or pattern for what shall become a function if evoked. The CompilerShall Generate the Necessary Variations of this Function During Run Time. Template Functions Must be placed in .hpp files! 34
Template - Multiple Parameters template <class InfoType, class HeaderNodeType> class Binary Tree { ... }; An important goal of both software engineering and object-oriented programming is reuse! Function Templates facilitate code reuse! 35
TemplatedClass ListType 36 36
Write The Class Definition For A Templated Class, Called ListType Whose Template Argument Is InfoType. template <class InfoType> class ListType { public: private: };
Write The Declaration To Create An Integer Type List , Called IntNos, of ListType. template <class InfoType> class ListType { public: private: };
Add An Array To The Private Data of ListType. template <class InfoType> class ListType { public: private: InfoType Info[10]; // Container To Store Data long ActNo; // Actual No Items In Container Bad Design Problem: Not All Of The ListsNeed The Same Capacity ListType <int> IntNos; ListType <char> Chars; ListType <Student> Class;
Add An Array To The Private Data of ListType. template <class InfoType> class ListType { public: private: InfoType * Info; // Container To Store Data long ActNo; // Actual No Items In Container Better Design Problem: Not All Of The ListsNeed The Same Capacity ListType <int> IntNos; ListType <char> Chars; ListType <Student> Class;
Write The Constructor ListType (long int NewMax = 10) template <class InfoType> class ListType { public: private: InfoType Info[10]; // Container To Store Data long Max, // Capacity Of The Container ActNo; // Actual No Items In Container };
Write The Code For The Constructor ListType (long int NewMax = 10) template <class InfoType> class ListType { public: private: InfoType Info[10]; // Container To Store Data long Max, // Capacity Of The Container ActNo; // Actual No Items In Container }; ListType (long int NewMax = 10);
ListType (long int NewMax = 10) template <class InfoType> ListType <InfoType> :: ListType (long int NewMax) { puts("Evoking Constructor ListType(NeMax)"); printf("NewMax = %ld\n\n", NewMax); }; Update main
ListType (long int NewMax = 10) Allocate Max + 1 Memory - Set Max & ActNo template <class InfoType> ListType <InfoType> :: ListType (long int NewMax) { ActNo = 0; Info = new InfoType [NewMax + 1]; if (Info == NULL) { puts("Not Enough Memory!"); Max = 0; } else Max = NewMax; };
"Memory Leak" You Have Created A Memory leak If You Have Executed The Program One TIme!? template <class InfoType> ListType <InfoType> :: ListType (long int NewMax) { ActNo = 0; Info = new InfoType [NewMax + 1]; if (Info == NULL) { puts("Not Enough Memory!"); Max = 0; } else Max = NewMax; }; WHY? Dynamic Memory Allocated!
Write The Destructor ~ListType (void) template <class InfoType> class ListType { public: ListType (long int NewMax = 10); ~ListType(void); private: InfoType Info[10]; long Max, ActNo; };