logging in or signing up chap11 Olivier Download Post to : URL : Related Presentations : Share Add to Flag Embed Email Send to Blogs and Networks Add to Channel Uploaded from authorPOINTLite Insert YouTube videos in PowerPont slides with aS Desktop Copy embed code: (To copy code, click on the text box) Embed: URL: Thumbnail: WordPress Embed Customize Embed The presentation is successfully added In Your Favorites. Views: 106 Category: Entertainment License: All Rights Reserved Like it (0) Dislike it (0) Added: December 28, 2007 This Presentation is Public Favorites: 0 Presentation Description No description available. Comments Posting comment... Premium member Presentation Transcript Chapter 11 - Templates: Chapter 11 - Templates Outline 11.1 Introduction 11.2 Function Templates 11.3 Overloading Function Templates 11.4 Class Templates 11.5 Class Templates and Nontype Parameters 11.6 Templates and Inheritance 11.7 Templates and Friends 11.8 Templates and static Members11.1 Introduction: 11.1 Introduction Templates Function templates Specify entire range of related (overloaded) functions Function-template specializations Class templates Specify entire range of related classes Class-template specializations 11.2 Function Templates: 11.2 Function Templates Overloaded functions Similar operations Different types of data Function templates Identical operations Different types of data Single function template Compiler generates separate object-code functions Type checking11.2 Function Templates: 11.2 Function Templates Function-template definitions Keyword template List formal type parameters in angle brackets (< and >) Each parameter preceded by keyword class or typename class and typename interchangeable template< class T > template< typename ElementType > template< class BorderType, class FillType > Specify types of Arguments to function Return type of function Variables within functionfig11_01.cpp(1 of 2): fig11_01.cpp (1 of 2) 1 // Fig. 11.1: fig11_01.cpp 2 // Using template functions. 3 #include <iostream> 4 5 using std::cout; 6 using std::endl; 7 8 // function template printArray definition 9 template< class T > 10 void printArray( const T *array, const int count ) 11 { 12 for ( int i = 0; i < count; i++ ) 13 cout << array[ i ] << " "; 14 15 cout << endl; 16 17 } // end function printArray 18 19 int main() 20 { 21 const int aCount = 5; 22 const int bCount = 7; 23 const int cCount = 6; 24 fig11_01.cpp(2 of 2): fig11_01.cpp (2 of 2) 25 int a[ aCount ] = { 1, 2, 3, 4, 5 }; 26 double b[ bCount ] = { 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7 }; 27 char c[ cCount ] = "HELLO"; // 6th position for null 28 29 cout << "Array a contains:" << endl; 30 31 // call integer function-template specialization 32 printArray( a, aCount ); 33 34 cout << "Array b contains:" << endl; 35 36 // call double function-template specialization 37 printArray( b, bCount ); 38 39 cout << "Array c contains:" << endl; 40 41 // call character function-template specialization 42 printArray( c, cCount ); 43 44 return 0; 45 46 } // end main fig11_01.cppoutput (1 of 1): fig11_01.cpp output (1 of 1) Array a contains: 1 2 3 4 5 Array b contains: 1.1 2.2 3.3 4.4 5.5 6.6 7.7 Array c contains: H E L L O 11.3 Overloading Function Templates: 11.3 Overloading Function Templates Related function-template specializations Same name Compiler uses overloading resolution Function template overloading Other function templates with same name Different parameters Non-template functions with same name Different function arguments Compiler performs matching process Tries to find precise match of function name and argument types If fails, function template Generate function-template specialization with precise match 11.4 Class Templates: 11.4 Class Templates Stack LIFO (last-in-first-out) structure Class templates Generic programming Describe notion of stack generically Instantiate type-specific version Parameterized types Require one or more type parameters Customize “generic class” template to form class-template specializationtstack1.h (1 of 4): tstack1.h (1 of 4) 1 // Fig. 11.2: tstack1.h 2 // Stack class template. 3 #ifndef TSTACK1_H 4 #define TSTACK1_H 5 6 template< class T > 7 class Stack { 8 9 public: 10 Stack( int = 10 ); // default constructor (stack size 10) 11 12 // destructor 13 ~Stack() 14 { 15 delete [] stackPtr; 16 17 } // end ~Stack destructor 18 19 bool push( const T& ); // push an element onto the stack 20 bool pop( T& ); // pop an element off the stack 21 tstack1.h (2 of 4): tstack1.h (2 of 4) 22 // determine whether Stack is empty 23 bool isEmpty() const 24 { 25 return top == -1; 26 27 } // end function isEmpty 28 29 // determine whether Stack is full 30 bool isFull() const 31 { 32 return top == size - 1; 33 34 } // end function isFull 35 36 private: 37 int size; // # of elements in the stack 38 int top; // location of the top element 39 T *stackPtr; // pointer to the stack 40 41 }; // end class Stack 42 tstack1.h (3 of 4): tstack1.h (3 of 4) 43 // constructor 44 template< class T > 45 Stack< T >::Stack( int s ) 46 { 47 size = s > 0 ? s : 10; 48 top = -1; // Stack initially empty 49 stackPtr = new T[ size ]; // allocate memory for elements 50 51 } // end Stack constructor 52 53 // push element onto stack; 54 // if successful, return true; otherwise, return false 55 template< class T > 56 bool Stack< T >::push( const T &pushValue ) 57 { 58 if ( !isFull() ) { 59 stackPtr[ ++top ] = pushValue; // place item on Stack 60 return true; // push successful 61 62 } // end if 63 64 return false; // push unsuccessful 65 66 } // end function push 67 tstack1.h (4 of 4): tstack1.h (4 of 4) 68 // pop element off stack; 69 // if successful, return true; otherwise, return false 70 template< class T > 71 bool Stack< T >::pop( T &popValue ) 72 { 73 if ( !isEmpty() ) { 74 popValue = stackPtr[ top-- ]; // remove item from Stack 75 return true; // pop successful 76 77 } // end if 78 79 return false; // pop unsuccessful 80 81 } // end function pop 82 83 #endif fig11_03.cpp(1 of 3): fig11_03.cpp (1 of 3) 1 // Fig. 11.3: fig11_03.cpp 2 // Stack-class-template test program. 3 #include <iostream> 4 5 using std::cout; 6 using std::cin; 7 using std::endl; 8 9 #include "tstack1.h" // Stack class template definition 10 11 int main() 12 { 13 Stack< double > doubleStack( 5 ); 14 double doubleValue = 1.1; 15 16 cout << "Pushing elements onto doubleStack\n"; 17 18 while ( doubleStack.push( doubleValue ) ) { 19 cout << doubleValue << ' '; 20 doubleValue += 1.1; 21 22 } // end while 23 24 cout << "\nStack is full. Cannot push " << doubleValue 25 << "\n\nPopping elements from doubleStack\n"; fig11_03.cpp(2 of 3): fig11_03.cpp (2 of 3) 26 27 while ( doubleStack.pop( doubleValue ) ) 28 cout << doubleValue << ' '; 29 30 cout << "\nStack is empty. Cannot pop\n"; 31 32 Stack< int > intStack; 33 int intValue = 1; 34 cout << "\nPushing elements onto intStack\n"; 35 36 while ( intStack.push( intValue ) ) { 37 cout << intValue << ' '; 38 ++intValue; 39 40 } // end while 41 42 cout << "\nStack is full. Cannot push " << intValue 43 << "\n\nPopping elements from intStack\n"; 44 45 while ( intStack.pop( intValue ) ) 46 cout << intValue << ' '; 47 48 cout << "\nStack is empty. Cannot pop\n"; 49 50 return 0; fig11_03.cpp(3 of 3)fig11_03.cppoutput (1 of 1): fig11_03.cpp (3 of 3) fig11_03.cpp output (1 of 1) 51 52 } // end main Pushing elements onto doubleStack 1.1 2.2 3.3 4.4 5.5 Stack is full. Cannot push 6.6 Popping elements from doubleStack 5.5 4.4 3.3 2.2 1.1 Stack is empty. Cannot pop Pushing elements onto intStack 1 2 3 4 5 6 7 8 9 10 Stack is full. Cannot push 11 Popping elements from intStack 10 9 8 7 6 5 4 3 2 1 Stack is empty. Cannot pop fig11_04.cpp(1 of 2): fig11_04.cpp (1 of 2) 1 // Fig. 11.4: fig11_04.cpp 2 // Stack class template test program. Function main uses a 3 // function template to manipulate objects of type Stack< T >. 4 #include <iostream> 5 6 using std::cout; 7 using std::cin; 8 using std::endl; 9 10 #include "tstack1.h" // Stack class template definition 11 12 // function template to manipulate Stack< T > 13 template< class T > 14 void testStack( 15 Stack< T > &theStack, // reference to Stack< T > 16 T value, // initial value to push 17 T increment, // increment for subsequent values 18 const char *stackName ) // name of the Stack < T > object 19 { 20 cout << "\nPushing elements onto " << stackName << '\n'; 21 22 while ( theStack.push( value ) ) { 23 cout << value << ' '; 24 value += increment; 25 26 } // end while fig11_04.cpp(2 of 2): fig11_04.cpp (2 of 2) 27 28 cout << "\nStack is full. Cannot push " << value 29 << "\n\nPopping elements from " << stackName << '\n'; 30 31 while ( theStack.pop( value ) ) 32 cout << value << ' '; 33 34 cout << "\nStack is empty. Cannot pop\n"; 35 36 } // end function testStack 37 38 int main() 39 { 40 Stack< double > doubleStack( 5 ); 41 Stack< int > intStack; 42 43 testStack( doubleStack, 1.1, 1.1, "doubleStack" ); 44 testStack( intStack, 1, 1, "intStack" ); 45 46 return 0; 47 48 } // end main fig11_04.cppoutput (1 of 1): fig11_04.cpp output (1 of 1) Pushing elements onto doubleStack 1.1 2.2 3.3 4.4 5.5 Stack is full. Cannot push 6.6 Popping elements from doubleStack 5.5 4.4 3.3 2.2 1.1 Stack is empty. Cannot pop Pushing elements onto intStack 1 2 3 4 5 6 7 8 9 10 Stack is full. Cannot push 11 Popping elements from intStack 10 9 8 7 6 5 4 3 2 1 Stack is empty. Cannot pop 11.5 Class Templates and Nontype Parameters: 11.5 Class Templates and Nontype Parameters Class templates Nontype parameters Default arguments Treated as consts Example: template< class T, int elements > Stack< double, 100 > mostRecentSalesFigures; Declares object of type Stack< double, 100> Type parameter Default type Example: template< class T = string > 11.5 Class Templates and Nontype Parameters: 11.5 Class Templates and Nontype Parameters Overriding class templates Class for specific type Does not match common class template Example: template<> Class Array< Martian > { // body of class definition }; 11.6 Templates and Inheritance: 11.6 Templates and Inheritance Several ways of relating templates and inheritance Class template derived from class-template specialization Class template derived from non-template class Class-template specialization derived from class-template specialization Non-template class derived from class-template specialization11.7 Templates and Friends: 11.7 Templates and Friends Friendships between class template and Global function Member function of another class Entire class11.7 Templates and Friends: 11.7 Templates and Friends friend functions Inside definition of template< class T > class X friend void f1(); f1() friend of all class-template specializations friend void f2( X< T > & ); f2( X< float > & ) friend of X< float > only, f2( X< double > & ) friend of X< double > only, f2( X< int > & ) friend of X< int > only, … friend void A::f4(); Member function f4 of class A friend of all class-template specializations11.7 Templates and Friends: 11.7 Templates and Friends friend functions Inside definition of template< class T > class X friend void C< T >::f5( X< T > & ); Member function C<float>::f5( X< float> & ) friend of class X<float> only friend classes Inside definition of template< class T > class X friend class Y; Every member function of Y friend of every class-template specialization friend class Z<T>; class Z<float> friend of class-template specialization X<float>, etc. 11.8 Templates and static Members: 11.8 Templates and static Members Non-template class static data members shared between all objects Class-template specialization Each has own copy of static data members static variables initialized at file scope Each has own copy of static member functions You do not have the permission to view this presentation. In order to view it, please contact the author of the presentation.
chap11 Olivier Download Post to : URL : Related Presentations : Share Add to Flag Embed Email Send to Blogs and Networks Add to Channel Uploaded from authorPOINTLite Insert YouTube videos in PowerPont slides with aS Desktop Copy embed code: (To copy code, click on the text box) Embed: URL: Thumbnail: WordPress Embed Customize Embed The presentation is successfully added In Your Favorites. Views: 106 Category: Entertainment License: All Rights Reserved Like it (0) Dislike it (0) Added: December 28, 2007 This Presentation is Public Favorites: 0 Presentation Description No description available. Comments Posting comment... Premium member Presentation Transcript Chapter 11 - Templates: Chapter 11 - Templates Outline 11.1 Introduction 11.2 Function Templates 11.3 Overloading Function Templates 11.4 Class Templates 11.5 Class Templates and Nontype Parameters 11.6 Templates and Inheritance 11.7 Templates and Friends 11.8 Templates and static Members11.1 Introduction: 11.1 Introduction Templates Function templates Specify entire range of related (overloaded) functions Function-template specializations Class templates Specify entire range of related classes Class-template specializations 11.2 Function Templates: 11.2 Function Templates Overloaded functions Similar operations Different types of data Function templates Identical operations Different types of data Single function template Compiler generates separate object-code functions Type checking11.2 Function Templates: 11.2 Function Templates Function-template definitions Keyword template List formal type parameters in angle brackets (< and >) Each parameter preceded by keyword class or typename class and typename interchangeable template< class T > template< typename ElementType > template< class BorderType, class FillType > Specify types of Arguments to function Return type of function Variables within functionfig11_01.cpp(1 of 2): fig11_01.cpp (1 of 2) 1 // Fig. 11.1: fig11_01.cpp 2 // Using template functions. 3 #include <iostream> 4 5 using std::cout; 6 using std::endl; 7 8 // function template printArray definition 9 template< class T > 10 void printArray( const T *array, const int count ) 11 { 12 for ( int i = 0; i < count; i++ ) 13 cout << array[ i ] << " "; 14 15 cout << endl; 16 17 } // end function printArray 18 19 int main() 20 { 21 const int aCount = 5; 22 const int bCount = 7; 23 const int cCount = 6; 24 fig11_01.cpp(2 of 2): fig11_01.cpp (2 of 2) 25 int a[ aCount ] = { 1, 2, 3, 4, 5 }; 26 double b[ bCount ] = { 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7 }; 27 char c[ cCount ] = "HELLO"; // 6th position for null 28 29 cout << "Array a contains:" << endl; 30 31 // call integer function-template specialization 32 printArray( a, aCount ); 33 34 cout << "Array b contains:" << endl; 35 36 // call double function-template specialization 37 printArray( b, bCount ); 38 39 cout << "Array c contains:" << endl; 40 41 // call character function-template specialization 42 printArray( c, cCount ); 43 44 return 0; 45 46 } // end main fig11_01.cppoutput (1 of 1): fig11_01.cpp output (1 of 1) Array a contains: 1 2 3 4 5 Array b contains: 1.1 2.2 3.3 4.4 5.5 6.6 7.7 Array c contains: H E L L O 11.3 Overloading Function Templates: 11.3 Overloading Function Templates Related function-template specializations Same name Compiler uses overloading resolution Function template overloading Other function templates with same name Different parameters Non-template functions with same name Different function arguments Compiler performs matching process Tries to find precise match of function name and argument types If fails, function template Generate function-template specialization with precise match 11.4 Class Templates: 11.4 Class Templates Stack LIFO (last-in-first-out) structure Class templates Generic programming Describe notion of stack generically Instantiate type-specific version Parameterized types Require one or more type parameters Customize “generic class” template to form class-template specializationtstack1.h (1 of 4): tstack1.h (1 of 4) 1 // Fig. 11.2: tstack1.h 2 // Stack class template. 3 #ifndef TSTACK1_H 4 #define TSTACK1_H 5 6 template< class T > 7 class Stack { 8 9 public: 10 Stack( int = 10 ); // default constructor (stack size 10) 11 12 // destructor 13 ~Stack() 14 { 15 delete [] stackPtr; 16 17 } // end ~Stack destructor 18 19 bool push( const T& ); // push an element onto the stack 20 bool pop( T& ); // pop an element off the stack 21 tstack1.h (2 of 4): tstack1.h (2 of 4) 22 // determine whether Stack is empty 23 bool isEmpty() const 24 { 25 return top == -1; 26 27 } // end function isEmpty 28 29 // determine whether Stack is full 30 bool isFull() const 31 { 32 return top == size - 1; 33 34 } // end function isFull 35 36 private: 37 int size; // # of elements in the stack 38 int top; // location of the top element 39 T *stackPtr; // pointer to the stack 40 41 }; // end class Stack 42 tstack1.h (3 of 4): tstack1.h (3 of 4) 43 // constructor 44 template< class T > 45 Stack< T >::Stack( int s ) 46 { 47 size = s > 0 ? s : 10; 48 top = -1; // Stack initially empty 49 stackPtr = new T[ size ]; // allocate memory for elements 50 51 } // end Stack constructor 52 53 // push element onto stack; 54 // if successful, return true; otherwise, return false 55 template< class T > 56 bool Stack< T >::push( const T &pushValue ) 57 { 58 if ( !isFull() ) { 59 stackPtr[ ++top ] = pushValue; // place item on Stack 60 return true; // push successful 61 62 } // end if 63 64 return false; // push unsuccessful 65 66 } // end function push 67 tstack1.h (4 of 4): tstack1.h (4 of 4) 68 // pop element off stack; 69 // if successful, return true; otherwise, return false 70 template< class T > 71 bool Stack< T >::pop( T &popValue ) 72 { 73 if ( !isEmpty() ) { 74 popValue = stackPtr[ top-- ]; // remove item from Stack 75 return true; // pop successful 76 77 } // end if 78 79 return false; // pop unsuccessful 80 81 } // end function pop 82 83 #endif fig11_03.cpp(1 of 3): fig11_03.cpp (1 of 3) 1 // Fig. 11.3: fig11_03.cpp 2 // Stack-class-template test program. 3 #include <iostream> 4 5 using std::cout; 6 using std::cin; 7 using std::endl; 8 9 #include "tstack1.h" // Stack class template definition 10 11 int main() 12 { 13 Stack< double > doubleStack( 5 ); 14 double doubleValue = 1.1; 15 16 cout << "Pushing elements onto doubleStack\n"; 17 18 while ( doubleStack.push( doubleValue ) ) { 19 cout << doubleValue << ' '; 20 doubleValue += 1.1; 21 22 } // end while 23 24 cout << "\nStack is full. Cannot push " << doubleValue 25 << "\n\nPopping elements from doubleStack\n"; fig11_03.cpp(2 of 3): fig11_03.cpp (2 of 3) 26 27 while ( doubleStack.pop( doubleValue ) ) 28 cout << doubleValue << ' '; 29 30 cout << "\nStack is empty. Cannot pop\n"; 31 32 Stack< int > intStack; 33 int intValue = 1; 34 cout << "\nPushing elements onto intStack\n"; 35 36 while ( intStack.push( intValue ) ) { 37 cout << intValue << ' '; 38 ++intValue; 39 40 } // end while 41 42 cout << "\nStack is full. Cannot push " << intValue 43 << "\n\nPopping elements from intStack\n"; 44 45 while ( intStack.pop( intValue ) ) 46 cout << intValue << ' '; 47 48 cout << "\nStack is empty. Cannot pop\n"; 49 50 return 0; fig11_03.cpp(3 of 3)fig11_03.cppoutput (1 of 1): fig11_03.cpp (3 of 3) fig11_03.cpp output (1 of 1) 51 52 } // end main Pushing elements onto doubleStack 1.1 2.2 3.3 4.4 5.5 Stack is full. Cannot push 6.6 Popping elements from doubleStack 5.5 4.4 3.3 2.2 1.1 Stack is empty. Cannot pop Pushing elements onto intStack 1 2 3 4 5 6 7 8 9 10 Stack is full. Cannot push 11 Popping elements from intStack 10 9 8 7 6 5 4 3 2 1 Stack is empty. Cannot pop fig11_04.cpp(1 of 2): fig11_04.cpp (1 of 2) 1 // Fig. 11.4: fig11_04.cpp 2 // Stack class template test program. Function main uses a 3 // function template to manipulate objects of type Stack< T >. 4 #include <iostream> 5 6 using std::cout; 7 using std::cin; 8 using std::endl; 9 10 #include "tstack1.h" // Stack class template definition 11 12 // function template to manipulate Stack< T > 13 template< class T > 14 void testStack( 15 Stack< T > &theStack, // reference to Stack< T > 16 T value, // initial value to push 17 T increment, // increment for subsequent values 18 const char *stackName ) // name of the Stack < T > object 19 { 20 cout << "\nPushing elements onto " << stackName << '\n'; 21 22 while ( theStack.push( value ) ) { 23 cout << value << ' '; 24 value += increment; 25 26 } // end while fig11_04.cpp(2 of 2): fig11_04.cpp (2 of 2) 27 28 cout << "\nStack is full. Cannot push " << value 29 << "\n\nPopping elements from " << stackName << '\n'; 30 31 while ( theStack.pop( value ) ) 32 cout << value << ' '; 33 34 cout << "\nStack is empty. Cannot pop\n"; 35 36 } // end function testStack 37 38 int main() 39 { 40 Stack< double > doubleStack( 5 ); 41 Stack< int > intStack; 42 43 testStack( doubleStack, 1.1, 1.1, "doubleStack" ); 44 testStack( intStack, 1, 1, "intStack" ); 45 46 return 0; 47 48 } // end main fig11_04.cppoutput (1 of 1): fig11_04.cpp output (1 of 1) Pushing elements onto doubleStack 1.1 2.2 3.3 4.4 5.5 Stack is full. Cannot push 6.6 Popping elements from doubleStack 5.5 4.4 3.3 2.2 1.1 Stack is empty. Cannot pop Pushing elements onto intStack 1 2 3 4 5 6 7 8 9 10 Stack is full. Cannot push 11 Popping elements from intStack 10 9 8 7 6 5 4 3 2 1 Stack is empty. Cannot pop 11.5 Class Templates and Nontype Parameters: 11.5 Class Templates and Nontype Parameters Class templates Nontype parameters Default arguments Treated as consts Example: template< class T, int elements > Stack< double, 100 > mostRecentSalesFigures; Declares object of type Stack< double, 100> Type parameter Default type Example: template< class T = string > 11.5 Class Templates and Nontype Parameters: 11.5 Class Templates and Nontype Parameters Overriding class templates Class for specific type Does not match common class template Example: template<> Class Array< Martian > { // body of class definition }; 11.6 Templates and Inheritance: 11.6 Templates and Inheritance Several ways of relating templates and inheritance Class template derived from class-template specialization Class template derived from non-template class Class-template specialization derived from class-template specialization Non-template class derived from class-template specialization11.7 Templates and Friends: 11.7 Templates and Friends Friendships between class template and Global function Member function of another class Entire class11.7 Templates and Friends: 11.7 Templates and Friends friend functions Inside definition of template< class T > class X friend void f1(); f1() friend of all class-template specializations friend void f2( X< T > & ); f2( X< float > & ) friend of X< float > only, f2( X< double > & ) friend of X< double > only, f2( X< int > & ) friend of X< int > only, … friend void A::f4(); Member function f4 of class A friend of all class-template specializations11.7 Templates and Friends: 11.7 Templates and Friends friend functions Inside definition of template< class T > class X friend void C< T >::f5( X< T > & ); Member function C<float>::f5( X< float> & ) friend of class X<float> only friend classes Inside definition of template< class T > class X friend class Y; Every member function of Y friend of every class-template specialization friend class Z<T>; class Z<float> friend of class-template specialization X<float>, etc. 11.8 Templates and static Members: 11.8 Templates and static Members Non-template class static data members shared between all objects Class-template specialization Each has own copy of static data members static variables initialized at file scope Each has own copy of static member functions