(A megoldás feltételez néhány olyan konstrukciót, amelyek csak a félév utolsó harmadában kerülnek elő. Ilyenek a kivételkezelés, az STL string osztálya. A megoldás ezen nyelvi konstrukciókat használó részeit az első időkben ugorjuk át, ilyenkor csak a
- konstruktor, másolókonstruktor
- destruktor
- operátor =
meglétére és implementálására figyeljünk. A megoldás színvonala a ZH-n már elvárt, de a félév első felében egyáltalán nem.)
A Stack.h állomány tartalma:
#ifndef STACK_H
#define STACK_H
#include<stdio.h>
#include<stdexcept>
#include<string>
class stack_exception: public std::exception
{
std::string message;
public:
stack_exception(std::string message):message(message){};
const char * what()const
{
return message.c_str();
}
};
class Stack
{
unsigned int elementNum;
int *pData;
public:
Stack() {elementNum=0;pData=NULL;}
// A másoló konstruktor szükséges a dinamikus adattagok miatt
Stack(const Stack& theOther);
// A destruktor felszabadítja a dinamikus adattagot
~Stack() {if(pData!=NULL) delete[]pData;}
bool isEmpty()const{return !elementNum;}
void pop(int& element);
void push(int element);
// Az = operátor, amely a mély másolást valósítja meg
const Stack& Stack::operator = (const Stack& theOther);
};
#endif /*STACK_H */
A stack.cpp állomány:
#include <limits>
#include <assert.h>
#include "Stack.h"
using namespace std;
Stack::Stack(const Stack& theOther)
{
// Az operator=-t hívjuk,
// és az érvényes adatot feltételez
pData = NULL;
*this=theOther;
}
const Stack& Stack::operator = (const Stack& theOther)
{
assert(this != &theOther);
// Felszabadítjuk az eddigi adatokat
if(pData!=NULL)
{
delete [] pData;
}
// Átmásoljuk a másik verem tartalmát
if(theOther.elementNum==0)
{
elementNum=0;
pData=NULL;
}
else
{
elementNum=theOther.elementNum;
pData=new int[elementNum];
for(unsigned int i=0;i<elementNum;i++)
{
pData[i]=theOther.pData[i];
}
}
return *this;
}
void Stack::pop(int& element)
{
if(elementNum==0)
{
// A félév elején ez egy lehetséges jó megoldás:
// cerr << "Data request from empty stack." << endl;