Download Object-Oriented Programming (OOP) Lecture 33: Templates and User-Defined Types and more Slides Object Oriented Programming in PDF only on Docsity! Object-Oriented Programming (OOP) Lecture No. 33 Docsity.com Recap • Templates are generic abstractions • C++ templates are of two kinds – Function Templates – Class Templates • A general template can be specialized to specifically handle a particular type Docsity.com …User-Defined Types • Consider the String class without overloaded operator “==“ class String { char* pStr; … // Operator “==“ not defined }; Docsity.com … User-Defined Types template< typename T > bool isEqual( T x, T y ) { return ( x == y ); } int main() { String s1 = “xyz”, s2 = “xyz”; isEqual( s1, s2 ); // Error! return 0; } Docsity.com …User-Defined Types class String { char* pStr; … friend bool operator ==( const String&, const String& ); }; Docsity.com Overloading vs Templates • Different data types, similar operation Needs function overloading • Different data types, identical operation Needs function templates Docsity.com Example Overloading vs Templates • ‘+’ operation is overloaded for different operand types • A single function template can calculate sum of array of many types Docsity.com …Example Overloading vs Templates String operator +( const String& x, const String& y ) { String tmp; tmp.pStr = new char[strlen(x.pStr) + strlen(y.pStr) + 1 ]; strcpy( tmp.pStr, x.pStr ); strcat( tmp.pStr, y.pStr ); return tmp; } Docsity.com Template Arguments as Policy • Policy specializes a template for an operation (behavior) Docsity.com Example – Policy • Write a function that compares two given character strings • Function can perform either case-sensitive or non-case sensitive comparison Docsity.com First Solution int caseSencompare( char* str1, char* str2 ) { for (int i = 0; i < strlen( str1 ) && i < strlen( str2 ); ++i) if ( str1[i] != str2[i] ) return str1[i] - str2[i]; return strlen(str1) - strlen(str2); } Docsity.com …Second Solution // if condition: (caseSen && str1[i] != str2[i]) || (!caseSen && toupper(str1[i]) != toupper(str2[i])) Docsity.com Third Solution class CaseSenCmp { public: static int isEqual( char x, char y ) { return x == y; } }; Docsity.com … Third Solution class NonCaseSenCmp { public: static int isEqual( char x, char y ) { return toupper(x) == toupper(y); } }; Docsity.com Sample Output Case Sensitive: 32 // Not Equal Non-case Sensitive: 0 // Equal Docsity.com Default Policy template< typename C = CaseSenCmp > int compare( char* str1, char* str2 ) { for (int i = 0; i < strlen( str1 ) && i < strlen( str2 ); i++) if ( !C::isEqual (str1[i], str2[i]) ) return str1[i] - str2[i]; return strlen(str1) - strlen(str2); }; Docsity.com …Third Solution int main() { int i, j; char *x = "hello", *y = "HELLO"; i = compare(x, y); j = compare< NonCaseSenCmp >(x, y); cout << "Case Sensitive: " << i; cout << "\nNon-Case Sensitive: “ << j << endl; return 0; } Docsity.com