1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197
|
#include <iostream>
#include <limits>
#include <stdexcept>
#include <string>
int redniBr = 100; // Non constant global variable...
// More or less like shooting on one's foot.
template <typename T1, typename T2>
class Kolekcija {
T1* niz1 { nullptr };
T2* niz2 { nullptr };
int trenutno {};
public:
Kolekcija() = default;
~Kolekcija()
{
delete[] niz1;
niz1 = nullptr;
delete[] niz2;
niz2 = nullptr;
}
Kolekcija(const Kolekcija& obj)
{
trenutno = obj.trenutno;
niz1 = new T1[trenutno];
niz2 = new T2[trenutno];
for (int i = 0; i < trenutno; i++) {
niz1[i] = obj.niz1[i];
niz2[i] = obj.niz2[i];
}
}
Kolekcija& operator=(const Kolekcija& obj)
{
if (this != &obj) {
delete[] niz1;
delete[] niz2;
trenutno = obj.trenutno;
niz1 = new T1[trenutno];
niz2 = new T2[trenutno];
for (int i = 0; i < trenutno; i++) {
niz1[i] = obj.niz1[i];
niz2[i] = obj.niz2[i];
}
}
return *this;
}
void addElement(const T1 e1, const T2 e2)
{
int new_size = trenutno + 1;
T1* temp1 = new T1[new_size];
T2* temp2 = new T2[new_size];
for (int i = 0; i < trenutno; i++) {
temp1[i] = niz1[i];
temp2[i] = niz2[i];
}
temp1[trenutno] = e1;
delete[] niz1;
niz1 = temp1;
temp2[trenutno] = e2;
delete[] niz2;
niz2 = temp2;
trenutno++;
}
int getTrenutno() const
{
return trenutno;
}
T1 getElement1(int lokacija) const
{
if(lokacija < trenutno) { return niz1[lokacija]; }
else {
throw std::out_of_range("Invalid position required\n");
}
}
T2 getElement2(int lokacija) const
{
if(lokacija < trenutno) { return niz2[lokacija]; }
else {
throw std::out_of_range("Invalid position required\n");
}
}
template<class T3, class T4>
friend std::ostream& operator<<(std::ostream& os, const Kolekcija<T3, T4>& obj);
};
template<class T3, class T4>
std::ostream& operator<<(std::ostream& os, const Kolekcija<T3, T4>& obj)
{
for (int i = 0; i < obj.getTrenutno(); i++) {
os << obj.niz1[i] << '-' << obj.niz2[i] << '\n';
}
return os;
}
// std::ostream& operator<<(std::ostream& os, const Krug& obj)
// {
// return os << "[" << obj.getX() << ", " << obj.getY() << "]\n";
// }
// std::ostream& operator<<(std::ostream& os, const Tacka& obj)
// {
// return os << "[" << obj.getX() << ", " << obj.getY() << "]\n";
// }
class Osoba {
std::string ime_prezime;
std::string jmbg;
public:
Osoba(std::string ip = "---", std::string jmb = "---")
: ime_prezime {ip}, jmbg {jmb}
{}
bool operator==(const Osoba& drugi)
{
return jmbg == drugi.jmbg;
}
};
class Imenik {
Kolekcija<Osoba, int>* imenikKolekcija;
std::string imenikID;
int trenutno;
public:
Imenik(std::string ID) : imenikKolekcija {new Kolekcija<Osoba, int>},
imenikID {ID},
trenutno {}
{}
~Imenik()
{
std::cout << "pozivam destruktor\n";
delete imenikKolekcija;
imenikKolekcija = nullptr;
}
/* Imenik(const Imenik& obj) {
_trenutno = obj._trenutno;
Kolekcija<Osoba, int> temp;
temp = *obj.imenikKolekcija;
imenikKolekcija = new Kolekcija<Osoba, int>(temp);
_imenikID = obj._imenikID;
}*/
Imenik& operator=(const Imenik& obj)
{
if (this != &obj) {
delete imenikKolekcija;
trenutno = obj.trenutno;
imenikKolekcija = new Kolekcija<Osoba, int>[trenutno];
for(int i{}; i<trenutno; ++i) {
imenikKolekcija[i] = obj.imenikKolekcija[i];
}
imenikID = obj.imenikID;
}
return *this;
}
Imenik& operator+=(const Osoba& osaba)
{
for (int i = 0; i < trenutno; i++) {
if (imenikKolekcija->getElement1(i) == osaba) {
std::cout << "Osoba vec postoji\n";
return *this;
}
}
imenikKolekcija->addElement(osaba, redniBr);
redniBr++;
trenutno++;
return *this;
}
};
void waitForEnter();
int main()
{
Kolekcija<int, int> k1;
try {
for (int i = 1; i <= 20; i++) {
k1.addElement(i, i * 2);
}
std::cout << k1;
Osoba o1("Emir", "Nemir");
Osoba o2("Mujo", "Mujic");
Imenik imenik1("FDB55");
imenik1 += o1;
//imenik1 += o1;
//imenik1 += o2;
} catch (std::out_of_range& e) {
std::cout << "Exception thrown: " << e.what()
<< "\nExiting now.\n";
}
waitForEnter();
return 0;
}
void waitForEnter()
{
std::cout << "\nPress ENTER to continue...\n";
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
|