Ласло Краус |
СИ2ОО1 Трећи колоквијум 3. 2. 2008. |
---|
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) Шта се дешава када се у некој catch грани изврши наредба throw;
?
б) Која врста повезивања се примењује на имена анонимног простора имена и како се користе имена из анонимног простора?
в) Шта се назива делимичном, а шта потпуном специјализацијом шаблона? Навести декларације као примере обе специјализације шаблона template
<class
T1,
class
T2>
class
S;
Коришћењем приложених готових класа за представљање фигура у равни које могу да се померају (+=
), написати на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни за безбедно коришћење класа; грешке пријављивати изузецима типа једноставних класа):
niz+=pod
– грешка је ако је низ пун), да се избаци податак са задатог места, да се дохвати податак на задатом месту (niz[k]
– грешка је ако је индекс изван опсега или ако је задато место празно) и да се низ упише у излазни ток (it<<niz
) у облику "<
податак#…#
податак>
".
(5 поена) Написати на језику C++ програм који направи цртеж који садржи три дужи, испише цртеж на главном излазу, помери цртеж за дати помак и поново испише цртеж на главном излазу. Користити константне параметре (не треба ништа читати с главног улаза).
class GPun {}; class GIndeks {}; class GPrazno {}; template <class T> class Niz { T** niz; int kap; void kopiraj (const Niz& n); void brisi (); public: explicit Niz (int k=10); Niz (const Niz& n) { kopiraj (n); } ~Niz () { brisi (); } Niz& operator= (const Niz& n) { if (this != &n) { brisi(); kopiraj(n); } return *this; } int kapac () const { return kap; } Niz& operator+= (const T& t); Niz& izbaci (int i) { if (i>=0 && i<kap) { delete niz[i]; niz[i] = 0; } return *this; } T& operator[] (int i) { if (i<0 || i>=kap) throw GIndeks (); if (! niz[i]) throw GPrazno (); return *niz[i]; } const T& operator[] (int i) const { if (i<0 || i>=kap) throw GIndeks (); if (! niz[i]) throw GPrazno (); return *niz[i]; } template <class T> friend ostream& operator<< (ostream& it, const Niz<T>& n); }; template <class T> void Niz<T>::kopiraj (const Niz& n) { niz = new T* [kap = n.kap]; for (int i=0; i<kap; i++) niz[i] = n.niz[i] ? n.niz[i]->kopija():0; } template <class T> void Niz<T>::brisi () { for (int i=0; i<kap; delete niz[i++]); delete [] niz; } template <class T> Niz<T>::Niz (int k) { niz = new T* [kap = k]; for (int i=0; i<k; niz[i++]=0); } template <class T> Niz<T>& Niz<T>::operator+= (const T& t) { int i = 0; while (i<kap && niz[i]) i++; if (i == kap) throw GPun (); niz[i] = t.kopija (); return *this; } template <class T> ostream& operator<< (ostream& it, const Niz<T>& n) { it << '<'; for (int i=0; i<n.kap; i++) { if (i) it << " # "; if (n.niz[i]) it << *n.niz[i]; } return it << '>'; } class Crtez: public Figura { Niz<Figura> niz; void pisi (ostream& it) const{ it << niz; } public: explicit Crtez (int kap): niz(kap) {} Crtez& operator+= (const Figura& f) { niz += f; return *this;} Crtez& operator+= (const Vektor& v); Crtez* kopija () const { return new Crtez (*this); } }; Crtez& Crtez::operator+= (const Vektor& v) { for (int i=0; i<niz.kapac(); i++) try { niz[i] += v; } catch (GPrazno) {} return *this; } int main () { Crtez crt (3); crt += Duz (Vektor(1,1),Vektor(2,3)); crt += Duz (Vektor(-1,0),Vektor(0,-5)); crt += Duz (Vektor(0,0),Vektor(-2,-3)); cout << crt << endl; crt += Vektor (2, 1); cout << crt << endl; return 0; }(⇒ почетак)
<(1,1)-(2,3) # (-1,0)-(0,-5) # (0,0)-(-2,-3)> <(3,2)-(4,4) # (1,1)-(2,-4) # (2,1)-(0,-2)>
Copyright © 2010, Laslo Kraus
Последња ревизија: 30.8.2010.