#include <iostream>
#include <iomanip>
template <class Type>
class Verem
{
int meret;
Type *verem;
int sp;
public:
Verem (int m = 3):meret (m), verem (new Type[m])
{
sp = -1;
}
Verem (Verem& v):meret (v.meret), verem (new Type[v.meret])
{
std::cout << "[" << std::setw(13) << std::setfill('.') << &verem << "]: Konstruktor {++}" << std::endl;
sp = v.sp;
for (int i = 0; i < v.meret; ++i)
{
std::cout << " i: " << i << "; Masolas elott: $$$$$$$$$$$$$$$" << std::endl;
verem[i] = v.verem[i];
std::cout << " i: " << i << "; Masolas utan: ..............." << std::endl;
}
std::cout << "[" << std::setw(13) << std::setfill('.') << &verem << "]: Konstruktor {--}" << std::endl;
}
~Verem ()
{
std::cout << "[" << std::setw(13) << std::setfill('.') << &verem << "]: DESTRUKTOR." << std::endl;
delete[] verem;
}
Verem& operator=(Verem& v)
{
std::cout << "[" << std::setw(13) << std::setfill('.') << &verem << "]: Masolo {++}" << std::endl;
Type *ujverem = new Type[v.meret];
sp = v.sp;
meret = v.meret;
for (int i = 0; i < v.meret; ++i)
{
std::cout << " i: " << i << "; Masolas elott: ///////////////" << std::endl;
ujverem[i] = v.verem[i];
std::cout << " i: " << i << "; Masolas elott: _______________" << std::endl;
}
delete[] verem;
verem = ujverem;
std::cout << "[" << std::setw(13) << std::setfill('.') << &verem << "]: Masolo {--}" << std::endl;
return *this;
}
Type& operator[](int i)
{
return verem[i];
}
Type pop ()
{
return verem[sp--];
}
void push(Type data)
{
std::cout << " # Push {++}" << std::endl;
verem[++sp] = data;
std::cout << " # Push {--}" << std::endl;
}
int getMeret()
{
return meret;
}
int getDarab()
{
return sp + 1;
}
Type* getAddress()
{
return &verem[0];
}
friend std::ostream& operator<<(std::ostream& os, Verem& v)
{
os << "[ " << v.getMeret() << ", " << v.getDarab() << " | ";
int mennyi = v.getDarab();
for (int i = 0; i < mennyi; ++i)
os << v[i] << ", ";
os << " ]";
return os;
}
};
int main(int argc, char *argv[])
{
Verem<char> v(4), u(5);
Verem< Verem<char> > vv(6), uu(7);
v.push('0');
v.push('1');
u.push('2');
u.push('3');
vv.push(v);
vv.push(v);
uu.push(u);
uu.push(u);
std::cout << "u: " << u << std::endl;
u = v;
std::cout << "v: " << v << std::endl;
std::cout << "u: " << u << std::endl;
std::cout << "uu: " << uu << std::endl;
uu = vv;
std::cout << "vv: " << vv << std::endl;
std::cout << "uu: " << uu << std::endl;
return 0;
}