In the class Stack, no test is made in push ( ) for stack overflow. The test should be made by the user to avoid abnormal program termination. Similarly, no test for stack underflow is made in pop ( ) and in topEl ( ). The tests can be incorporated in all these member functions in a variety of ways. Here are some examples.
a. void push(const $\mathrm{T} \& \mathrm{e}$, , bool& pushed) $\{\ldots\}$
In this definition, pushed would be set by push ( ) to false if stack is full and to true if el can be pushed onto the stack. The variable pushed is tested by the user after push ( ) is finished.
b. bool push(const $\mathrm{T} \&$ el) $\{\ldots\}$
In this version, the return value plays the same role as pushed in the previous version. push ( ) returns true if el was pushed successfully, false otherwise.
c. void push(const $T \&$ el) {
if (isfull()) $\operatorname{exit}(0)$;
else...
Interrupt the program when an attempt is made to push an element onto a full stack, possibly printing an error message, and push the element on the stack otherwise.
What are the disadvantages of these definitions?