As we did with function templates, we declare and define class
Stack<> in a header file as follows
As you can see, the class template is implemented by using a
class template of the C++ standard library: vector<>. As a
result, we don't have to implement memory management, copy constructor, and
assignment operator, so we can concentrate on the interface of this class
template.
Declaration of Class Templates
Declaring class templates is similar to declaring function
templates: Before the declaration, a statement declares an identifier as a type
parameter. Again, T is usually used as an identifier:
Here again, the keyword class can be used instead of
typename:
Inside the class template, T can be used just like any
other type to declare members and member functions. In this example, T
is used to declare the type of the elements as vector of Ts, to declare
push() as a member function that gets a constant T reference
as an argument, and to declare top() as a function that returns a
T:
The type of this class is Stack<T>, with
T being a template parameter. Thus, you have to use
Stack<T> whenever you use the type of this class in a
declaration. If, for example, you have to declare your own copy constructor and
assignment operator, it looks like this:
According to the standard, there are some exceptions to this rule. However, to be sure, you should always write the full type when the type is required.
However, when the name and not the type of the class is
required, only Stack has to be used. This is the case when you specify
the name of the class, the constructors, and the destructor.
Implementation of Member Functions
To define a member function of a class template, you have to
specify that it is a function template, and you have to use the full type
qualification of the class template. Thus, the implementation of the member
function push() for type Stack<T> looks like this:
In this case, push_back() of the element vector is
called, which appends the element at the end of the vector.
Note that pop_back() of a vector removes the last
element but doesn't return it. The reason for this behavior is exception safety.
It is impossible to implement a completely exception-safe version of
pop() that returns the removed element. However, ignoring
this danger, we could implement a pop() that returns the element just
removed. To do this, we simply use T to declare a local variable of the
element type:
Because the vectors back() (which returns the last
element) and pop_back() (which removes the last element) have undefined
behavior when there is no element in the vector, we have to check whether the
stack is empty. If it is empty, we throw an exception of type
std::out_of_range. This is also done in top(), which returns
but does not remove the top element:
Of course, as for any member function, you can also implement
member functions of class templates as an inline function inside the class
declaration. For example:
-----------------------------------------------------------------
See Also:
-----------------------------------------------------------------
See Also:
-----------------------------------------------------------------
- Complete Tutorial of C++ Template's
- Standard Template Library Tutorial
- Inter Process Communication Tutorial
- Advance Programming in C & C++
-----------------------------------------------------------------
No comments:
Post a Comment