Ласло Краус |
ИР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.