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