Ласло Краус |
ИР2ОО1 Колоквијум 18. 11. 2012. |
|---|
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) Какве су последице извршења оператора delete ако (1) операнд показује на објекат који није створен оператором new (2) операнд има вредност NULL?
б) Шта је проблем следеће функције T& g(){return T();} , где је Т нека класа?
в) Да ли се оператор -> преклапа као бинарни или унарни оператор, да ли може да се преклопи као статичка метода и ког типа треба да буде резултат те операторске функције?
Написати на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни за безбедно коришћење класа):
broj1==broj2) и да се упише у излазни ток (it<<broj).
it<<pretpl) у облику име(број).
imenik+=&pretpl). Повратна вредност је индикатор успеха додавања. Неуспех је ако нема места у именику или ако именик већ садржи претплатника који има исти телефонски број. Претплатник не постаје власништво именика. Претплатници из једног именика могу да се додају у други (imenik1+=imenik2). Може да се дохвати име претплатника са задатим телефонским бројем (imenik[broj]), да се именик испразни (~imenik) и да се именик упише у излазни ток (it<<imenik), један претплатник по реду.
(10 поена) Написати на језику C++ програм који направи телефонски именик, дода неколико претплатника, испише на главном излазу именик и име једног претплатника са задатим телефонским бројем. Користити фиксне параметре (не треба ништа учитавати с главног улаза).
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
class Broj {
char broj[16];
public:
explicit Broj(const char* br="") { strcpy(broj, br); }
const char* dohvBroj() const { return broj; }
bool operator==(const Broj& br) const
{ return strcmp(broj, br.broj)==0; }
friend ostream& operator<<(ostream& it, const Broj& br)
{ return it << br.broj; }
};
class Pretpl {
char* ime;
Broj broj;
void kopiraj(const char* im, const Broj& br) {
ime = new char [strlen(im)+1];
strcpy(ime, im);
broj = br;
}
void brisi() { delete [] ime; }
public:
Pretpl(const char* im, const Broj& br) { kopiraj(im, br); }
Pretpl(const Pretpl& pr) { kopiraj(pr.ime, pr.broj); }
~Pretpl() { brisi(); }
Pretpl& operator=(const Pretpl& pr) {
if (this != &pr) { brisi(); kopiraj(pr.ime, pr.broj); }
return *this;
}
const char* dohvIme()const{return ime;}
const Broj& dohvBroj() const { return broj; }
friend ostream& operator<<(ostream& it, const Pretpl& pr)
{ return it<<pr.ime<<'('<<pr.broj<<')'; }
};
class Imenik {
Pretpl** pretpl;
int kap, duz;
void kopiraj(const Imenik& imen);
void brisi() { delete [] pretpl; }
public:
explicit Imenik(int k=10) {
pretpl = new Pretpl* [kap = k];
duz = 0;
}
Imenik(const Imenik& imen) { kopiraj(imen); }
~Imenik() { brisi(); }
Imenik& operator=(const Imenik& imen) {
if (this != &imen) { brisi(); kopiraj(imen); }
return *this;
}
int brPretpl() const { return duz; }
bool operator+=(Pretpl* pr);
Imenik& operator+=(const Imenik& im);
const char* operator[](const Broj& br) const;
Imenik& operator~() { duz = 0; return *this; }
friend ostream& operator<<(ostream& it, const Imenik& imen);
};
void Imenik::kopiraj(const Imenik& imen) {
pretpl = new Pretpl* [kap = imen.kap];
duz = imen.duz;
for (int i=0; i<duz; i++) pretpl[i] = imen.pretpl[i];
}
bool Imenik::operator+=(Pretpl* pr) {
if (duz==kap || (*this)[pr->dohvBroj()]!=0)
return false;
pretpl[duz++] = pr;
return true;
}
Imenik& Imenik::operator+=(const Imenik& im) {
for (int i=0; i<duz; i++)
if (!(*this += im.pretpl[i])) exit(1);
return *this;
}
const char* Imenik::operator[] (const Broj& br) const {
for (int i=0; i<duz; i++)
if (pretpl[i]->dohvBroj() == br) return pretpl[i]->dohvIme();
return 0;
}
ostream& operator<<(ostream& it, const Imenik& imen) {
for (int i=0; i<imen.duz; i++) cout << *imen.pretpl[i] << endl;
return it;
}
int main() {
Imenik imen(20);
Pretpl marko("Marko",Broj("1234567"));
Pretpl zoran("Zoran",Broj("4444444"));
Pretpl petar("Petar",Broj("1234567"));
Pretpl milan("Milan",Broj("7654321"));
imen += &marko; imen += &zoran;
imen += &petar; imen += &milan;
cout << imen << endl << imen[Broj("4444444")] << endl;
return 0;
}
Marko(1234567)
Zoran(4444444)
Milan(7654321)
Zoran
(⇒ почетак)
Copyright © 2013, Laslo Kraus
Последња ревизија: 20.11.2013.