Ласло Краус |
ИР2ОО1/СИ2ОО1 Испит 25. 1. 2010. |
---|
Одговорити концизно (једна или две реченице) и прецизно на следећа питaња:
а) Како се може иницијализовати атрибут који је референца (упућивач) у некој класи?
б) Колико пута се изврши конструктор основне класе B при креирању објекта класе D која је вишеструко изведена из класа X, Y, Z, ако је класа B (1) виртуелна (2) невиртуелна основна класа за класе X, Y и Z?
в) Да ли је механизам генерика (шаблона) статички или динамички и зашто?
Написати на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни за безбедно коришћење класа; грешке пријављивати изузецима типа једноставних класа које су опремљене писањем текста поруке):
it<<elem) у облику (
модел,
врста,
тежина)
.
- Мотор је елемент који има број цилиндара и једнозначан аутоматски генерисан целобројни идентификатор мотора. Назив врсте је
motor
. У излазни ток се пише у облику (
модел,
врста,
тежина)[
идБрој,
бројЦилиндара]
.
- Шасија са каросеријом је елемент који има једнозначан аутоматски генерисан целобројни идентификатор шасије и боју из скупа: бела, жута, црвена, зелена, плава и црна. Назив врсте је
sasija
. У излазни ток се пише у облику (
модел,
врста,
тежина)[
идБрој,
бојаСловима]
.
- (20 поена) Аутомобил садржи шасију са каросеријом и мотор. Грешка је ако се покуша склопити од елемената различитог модела. Може да се упише у излазни ток (
it<<auto
) у облику auto{
шасија,
мотор}
.
- Производна трака садржи листу показивача на аутомобиле. Може да се стави (
traka<<&auto
) и да се узме (traka>>&auto
) један аутомобил са траке. Трака не може да се копира ни на који начин.
(10 поена) Написати на језику C++ програм који направи производну траку, стави на њу три аутомобила и на крају узме са ње два аутомобила и испише их на главном излазу. Користити фиксне параметре (не треба ништа учитавати с главног улаза).
#include <iostream> #include <cstring> using namespace std; class GPrazna{}; inline ostream& operator<<( ostream& it, const GPrazna&) { return it << "*** Lista je prazna!"; } template <typename T> class Lista { struct Elem { T t; Elem* sled; Elem( const T& tt) { t = tt; sled = 0; } }; Elem *prvi, *posl; void kopiraj( const Lista& lst); void brisi(); public: Lista() { prvi = posl = 0; } Lista( const Lista& lst) { kopiraj( lst); } ~Lista() { brisi(); } Lista& operator=( const Lista& lst) { if (this != &lst) { brisi(); kopiraj( lst); } return *this; } Lista& dodaj( const T& t) { posl = (!prvi?prvi:posl->sled) = new Elem( t); return *this; } T uzmi() { if (!prvi) throw GPrazna(); T t = prvi->t; Elem* stari = prvi; prvi = prvi->sled; delete stari; if (!prvi) posl = 0; return t; } bool prazna() const { return prvi == 0; } }; template <typename T> void Lista<T>::kopiraj( const Lista<T>& lst) { prvi = posl = 0; for (Elem* tek=lst.prvi; tek; tek=tek->sled) posl=(!prvi?prvi:posl->sled)=new Elem(tek->t); } template <typename T> void Lista<T>::brisi() { while (prvi) { Elem* stari = prvi; prvi = prvi->sled; delete stari; } posl = 0; } class Element { char* mod; double tez; void kopiraj (const Element& ele) { mod = strcpy( new char[strlen(ele.mod)+1], ele.mod); tez = ele.tez; } void brisi() { delete [] mod; } public: Element( const char* m, double t) { mod = strcpy( new char [strlen(m)+1], m); tez = t; } Element( const Element& ele) { kopiraj( ele); } virtual ~Element() { brisi(); } Element& operator=( const Element& ele) { if (this != &ele) { brisi(); kopiraj( ele); } return *this; } const char* model() const { return mod; } double tezina() const { return tez; } virtual const char* vrsta() const =0; protected: virtual void pisi( ostream& it) const { it << '(' << mod << ',' << vrsta() << ',' << tez << ')'; } friend ostream& operator<<( ostream& it, const Element& ele) { ele.pisi(it); return it; } }; class Motor: public Element { static int ukId; int id, brCil; void pisi( ostream& it) const { Element::pisi( it); it << '[' << id << ',' << brCil << ']'; } public: Motor( const char* mod, double tez, int brC=4): Element( mod, tez) { brCil = brC; id = ++ukId; } Motor( const Motor& m): Element( m) { brCil = m.brCil; id = ++ukId;} Motor& operator=( const Motor& m) { Element::operator=( m); brCil = m.brCil; } const char* vrsta () const { return "motor"; } }; int Motor::ukId = 0; class Sasija: public Element { public: enum Boja {BELA,ZUTA,CRVENA,ZELENA,PLAVA,CRNA }; private: static int ukId; int id; Boja boja; static const char* boje[]; void pisi( ostream& it) const { Element::pisi( it); it << '[' << id << ',' << boje[boja] << ']'; } public: Sasija( const char* mod, double tez, Boja b=BELA): Element( mod, tez) { boja = b; id = ++ukId; } Sasija( const Sasija& s): Element( s) { boja = s.boja; id = ++ukId; } Sasija& operator=( const Sasija& s) { Sasija::operator=( s); boja = s.boja; } const char* vrsta () const { return "sasija"; } }; int Sasija::ukId = 0; const char* Sasija::boje[] = { "bela", "zuta", "crvena", "zelena", "plava", "crna" }; class GModel {}; inline ostream& operator<<( ostream& it, const GModel&) { return it << "*** Razliciti modeli delova!"; } class Automobil { Motor mot; Sasija sas; public: Automobil( const Motor& m, const Sasija& s): mot(m), sas(s) { if (strcmp( m.model(), s.model()) != 0) throw GModel(); } friend ostream& operator<<( ostream& it, const Automobil& a) { return it <<"auto{" <<a.sas <<";" <<a.mot <<'}'; } }; class Traka { Lista<Automobil*> lst; Traka( const Traka&) {} void operator=( const Traka&) {} public: Traka() {} ~Traka(); Traka &operator<<(Automobil* a) { lst.dodaj(a); return *this; } Traka &operator>>(Automobil*& a) { a=!lst.prazna()?lst.uzmi():0; return *this; } }; Traka::~Traka() { while (!lst.prazna()) delete lst.uzmi(); }; int main() { Traka t; try { t << new Automobil(Motor("BMW", 400), Sasija("BMW", 3000, Sasija::BELA)); t << new Automobil(Motor("VW", 300), Sasija("VW", 2500, Sasija::ZELENA)); t << new Automobil(Motor("Kia", 500), Sasija("Kia", 3500, Sasija::CRNA)); Automobil* a; t >> a; if (a) { cout << *a << endl; delete a; } t >> a; if (a) { cout << *a << endl; delete a; } } catch (GModel g) { cout << g << endl; } return 0; }(⇒ почетак)
auto{(BMW,sasija,3000)[2,bela];(BMW,motor,400)[2,4]} auto{(VW,sasija,2500)[4,zelena];(VW,motor,300)[4,4]}
Copyright © 2010, Laslo Kraus
Последња ревизија: 30.8.2010.