Presentation is loading. Please wait.

Presentation is loading. Please wait.

Chapter 6 Lists Plus. What is a Class Template? A class template allows the compiler to generate multiple versions of a class type by using type parameters.

Similar presentations


Presentation on theme: "Chapter 6 Lists Plus. What is a Class Template? A class template allows the compiler to generate multiple versions of a class type by using type parameters."— Presentation transcript:

1 Chapter 6 Lists Plus

2 What is a Class Template? A class template allows the compiler to generate multiple versions of a class type by using type parameters. The formal parameter appears in the class template definition, and the actual parameter appears in the client code. Both are enclosed in pointed brackets,.

3 StackType numStack; top 3 [MAX_ITEMS-1]. [ 3 ] 789 [ 2 ] -56 [ 1 ] 132 items [ 0 ] 5670 ACTUAL PARAMETER

4 top 3 [MAX_ITEMS-1]. [ 3 ] 3456.8 [ 2 ] -90.98 [ 1 ] 98.6 items [ 0 ] 167.87 StackType numStack; ACTUAL PARAMETER

5 top 3 [MAX_ITEMS-1]. [ 3 ] Bradley [ 2 ] Asad [ 1 ] Rodrigo items [ 0 ] Max StackType numStack; ACTUAL PARAMETER

6 //-------------------------------------------------------- // CLASS TEMPLATE DEFINITION //-------------------------------------------------------- #include "ItemType.h" // for MAX_ITEMS and ItemTyp template // formal parameter list class StackType { public: StackType( ); bool IsEmpty( ) const; bool IsFull( ) const; void Push( ItemType item ); void Pop( ItemType item ); ItemType Top( ); private: int top; ItemType items[MAX_ITEMS]; };

7 //-------------------------------------------------------- // SAMPLE CLASS MEMBER FUNCTIONS //-------------------------------------------------------- template // formal parameter list StackType ::StackType( ) { top = -1; } template // formal parameter list void StackType ::Push ( ItemType newItem ) { if (IsFull()) throw FullStack(); top++; items[top] = newItem;// STATIC ARRAY IMPLEMENTATION }

8 Using class templates The actual parameter to the template is a data type. Any type can be used, either built-in or user-defined. Templates are instantiated at run time. Can you see how this might cause a problem?

9 When creating class template Put.h and.cpp in same file or Have.h include.cpp file

10 What is a Circular Linked List? A circular linked list is a list in which every node has a successor; the “last” element is succeeded by the “first” element.

11 External Pointer to the Last Node

12 What is a Doubly Linked List? A doubly linked list is a list in which each node is linked to both its successor and its predecessor.

13 Linking the New Node into the List

14 Deleting from a Doubly Linked List

15 What are Header and Trailer Nodes? A Header Node is a node at the beginning of a list that contains a key value smaller than any possible key. A Trailer Node is a node at the end of a list that contains a key larger than any possible key. Both header and trailer are placeholding nodes used to simplify list processing.

16 Recall Definition of Stack Logical (or ADT) level: A stack is an ordered group of homogeneous items (elements), in which the removal and addition of stack items can take place only at the top of the stack. A stack is a LIFO “last in, first out” structure.

17 class StackType StackType Top Pop Push IsFull IsEmpty Private data: topPtr ~StackType 20 30

18 What happens... When a function is called that uses pass by value for a class object like our dynamically linked stack?

19 19 Pass by value makes a shallow copy 20 30 StackType myStack; // CLIENT CODE. MyFunction( myStack ); // function call Private data: 7000 6000 topPtr 7000 Private data: topPtr 7000 myStack momeStack shallow copy

20 What’s the difference? A shallow copy shares the pointed to data with the original class object. A deep copy stores its own copy of the pointed to data at different locations than the data in the original class object.

21 Making a deep copy 20 30 Private data: 7000 6000 topPtr 7000 someStack 20 30 Private data: 5000 2000 topPtr 5000 myStack deep copy

22 // FUNCTION CODE template void MyFunction( StackType SomeStack ) // Uses pass by value { ItemType item; SomeStack.Pop(item);. } Suppose MyFunction Uses Pop What happens in a shallow copy?

23 23 MyStack.topPtr is left dangling ? 30 StackType myStack; // CLIENT CODE. MyFunction( myStack ); Private data: topPtr 6000 myStack someStack shallow copy Private data: 7000 6000 topPtr 7000

24 24 MyStack.topPtr is left dangling ? 30 Private data: topPtr 6000 myStack someStack shallow copy Private data: 7000 6000 topPtr 7000 Notice that the shallow copy and the actual parameter myStack, have changed!

25 As a result... This default method used for pass by value is not the best way when a data member points to dynamic data. Instead, you should write what is called a copy constructor, which makes a deep copy of the dynamic data in a different memory location.

26 More about copy constructors When there is a copy constructor provided for a class, the copy constructor is used to make copies for pass by value. You do not call the copy constructor. Like other constructors, it has no return type. Because the copy constructor properly defines pass by value for your class, it must use pass by reference in its definition.

27 Copy Constructor Copy constructor is a special member function of a class that is implicitly called in these three situations: passing object parameters by value, initializing an object variable in a declaration, returning an object as the return value of a function.

28 // DYNAMICALLY LINKED IMPLEMENTATION OF STACK template class StackType { public: StackType( ); // Default constructor. // Post: Stack is created and empty. StackType( const StackType & anotherStack ); // Copy constructor. // Implicitly called for pass by value.. ~StackType( ); // Destructor. // Post: Memory for nodes has been deallocated. private: NodeType * topPtr; };

29 CLASS CONSTRUCTOR CLASS COPY CONSTRUCTOR CLASS DESTRUCTOR Classes with Data Member Pointers Need

30 template // COPY CONSTRUCTOR StackType :: StackType( const StackType & anotherStack ) {NodeType * ptr1; NodeType * ptr2; if ( anotherStack.topPtr == NULL ) topPtr = NULL; else // allocate memory for first node {topPtr = new NodeType ; topPtr->info = anotherStack.topPtr->info; ptr1 = anotherStack.topPtr->next; ptr2 = topPtr; while ( ptr1 != NULL )// deep copy other nodes {ptr2->next = new NodeType ; ptr2 = ptr2->next; ptr2->info = ptr1->info; ptr1 = ptr1->next; } ptr2->next = NULL; }

31 What About the Assignment Operator? The default method used for assignment of class objects makes a shallow copy. If your class has a data member pointer to dynamic data, you should write a member function to overload the assignment operator to make a deep copy of the dynamic data.

32 // DYNAMICALLY LINKED IMPLEMENTATION OF STACK template class StackType { public: StackType( ); // Default constructor. StackType(const StackType & anotherStack ); // Copy constructor. void operator= ( StackType ); // Overloads assignment operator.. ~StackType( ); // Destructor. private: NodeType * topPtr; };

33 C++ Operator Overloading Guides 1All operators except these ::. sizeof ?: may be overloaded. 2At least one operand must be a class instance. 3You cannot change precedence, operator symbols, or number of operands. 4Overloading ++ and -- requires prefix form use by default, unless special mechanism is used. 5To overload these operators = ( ) [ ] member functions (not friend functions) must be used. 6An operator can be given multiple meanings if the data types of operands differ.

34 Using Overloaded Binary operator+ When a Member Function was defined myStack + yourStack myStack.operator+(yourStack) When a Friend Function was defined myStack + yourStack operator+(myStack, yourStack)

35 A Sorted list Stored in an Array of Nodes

36 An Array with Linked List of Values and Free Space

37 An Array with Three Lists (Including the Free List)

38 Polymorphism with Virtual Functions formalParameter.MemberFunction(...); then 1.If MemberFunction is not a virtual function, the type of the formal parameter determines which function to call. (Static binding is used.) 2.If MemberFunction is a virtual function, the type of the actual parameter determines which function to call. (Dynamic binding is used.).

39 What are the advantages of a circular doubly linked list?


Download ppt "Chapter 6 Lists Plus. What is a Class Template? A class template allows the compiler to generate multiple versions of a class type by using type parameters."

Similar presentations


Ads by Google