����� ����� |
��2��1/��2��1 ����� 16. 1. 2014. |
---|
���������� �������� (����� ��� ��� ��������) � �������� �� ������ ���a��:
�) �� �� ���� �� �� �������� ������� ����������� �������� ��������� ���������� �������� �� ��� ��������� ��������� � �����?
�) ��� ��: class
I:public
O{…};
� ��� ��: I
i[10];
������� ������� ��� �� ��������� �������� ������ m(i);
�� ��������� void
m(O
*o){…o[3]…}
. �� �� ������� ���� �� �� ������ � ����� ������� � �����?
�) A�� ������ ��������� ����� template
<typename
A,
typename
B>
class
X{…};
��� ������������� �� �������� �� ������ ��������� ��������� (���������) �
�������� ���������� int
, �������� ���������� ��������� ����� ��� ������ �������.
�������� �� ������ C++ ������ ����� (����� �������� ���� ��������������, ������������ � ���������� �� ������ ���������, ��� �� �������� �� �������� �������� �����; ������ ���������� ��������� ���� ������������ ����� ��� �� �������� ������� ������ ������):
it<<dete
) � ������ ime:
pol, ��� �� ������ �ô�� ����� �
��� Z
.
it<<pok
) � ������ vrsta.
id(
cena)
.
�
, L
� U
, � ������� �� �����, ������ ������� � ����� � ����� ����, �����������. ������ �?���a ����� �� ������� ������� ��: ����� � M
, ������ � Z
��� ��� �ô�� � ?
.
it<<zbirka
) � ������ [
�����,…,
�����]
.
�������� �� ������ C++ ������� ��� ������ �������, ������ �� �� �������� ������� � ������ �� �� ������� ������, ������ ���� � ���� ����� ��� ������� ������ �� �� ���� � ������ �� ������� ������ ����, ������ � ������� ������ ��������. ��� ��������� ����� �� ���� ��������� (�� ����� ����� �������).
#include <iostream> #include <cstring> using namespace std; class Dete { char pol; char* ime; Dete(const Dete&) {} void operator=(const Dete&) {} public: Dete(const char* iime, char ppol) { ime = new char [strlen(iime)+1]; strcpy(ime, iime); pol = ppol; } ~Dete() { delete [] ime; } const char* dohIme() const { return ime; } char dohPol() const { return pol; } friend ostream& operator<<(ostream& it, const Dete& d) { return it<<d.ime<<':'<<d.pol; } }; class Poklon { static int posId; int id; float cena; public: Poklon(float c) {cena=c; id=++posId;} Poklon(const Poklon& p) { cena = p.cena; id = ++posId; } virtual ~Poklon() {} Poklon& operator=(const Poklon& p) { cena = p.cena; return *this; } virtual char dohVrs() const =0; virtual char dohPol() const =0; virtual float dohCen() const { return cena; } virtual Poklon* kopija() const =0; friend ostream& operator<< (ostream& it, const Poklon& p) { return it << p.dohVrs() << '.' << p.id << '(' << p.cena <<')';} }; int Poklon::posId = 0; class Autic: public Poklon { public: Autic(float cena): Poklon(cena) {} char dohVrs() const { return 'A'; } char dohPol() const { return 'M'; } Autic* kopija() const { return new Autic(*this); } }; class Lutka: public Poklon { public: Lutka(float cena): Poklon(cena) {} char dohVrs() const { return 'L'; } char dohPol() const { return 'Z'; } Lutka* kopija() const { return new Lutka(*this); } }; class Ukras: public Poklon { public: Ukras(float cena): Poklon(cena) {} char dohVrs() const { return 'U'; } char dohPol() const { return '?'; } Ukras* kopija() const { return new Ukras(*this); } }; class GPrazna {}; inline ostream& operator<<(ostream& it, const GPrazna&) { return it << "*** Zbirka je prazna!";} template <typename E> class Zbirka { struct Elem { E* e; Elem* sled; Elem(E *ee) { e = ee; sled = 0; } }; Elem *prvi, *posl; int duz; void kopiraj(const Zbirka& z); void brisi(); public: Zbirka() { prvi = posl = 0; duz = 0; } Zbirka(const Zbirka& z) { kopiraj(z);} ~Zbirka() { brisi(); } Zbirka& operator=(const Zbirka& z) { if (this != &z) {brisi(); kopiraj(z);} return *this; } virtual Zbirka& stavi(E* e) { posl = (!prvi ? prvi : posl ->s led) = new Elem(e); duz++; return *this; } virtual E* uzmi() { if (!prvi) throw GPrazna(); E* e = prvi->e; Elem* stari = prvi; prvi = prvi->sled; delete stari; if (!prvi) posl = 0; duz--; return e; } int brElem() const { return duz; } template <typename T> friend ostream& operator<< (ostream& it, const Zbirka<T>&z); }; template <typename E> void Zbirka<E>::kopiraj(const Zbirka<E>& z) { prvi = posl = 0; duz = z.duz; for (Elem* tek=z.prvi; tek; tek=tek->sled) posl = (!prvi ? prvi : posl->sled) = new Elem(tek->e->kopija()); } template <typename E> void Zbirka<E>::brisi() { while (prvi) { Elem* stari = prvi; prvi=prvi->sled; delete stari->e; delete stari; } posl = 0; duz = 0; } template <typename T> ostream& operator<<(ostream& it, const Zbirka<T>& z) { it << '['; for (Zbirka<T>::Elem* tek=z.prvi; tek; tek=tek->sled) { it<<*tek->e; if (tek->sled) it<<','; } return it << ']'; } class Magacin: public Zbirka<Poklon> { Magacin(const Magacin&) {}; void operator=(const Magacin&) {}; public: Magacin(): Zbirka<Poklon>() {} }; class GPol {}; inline ostream& operator<<(ostream& it, const GPol&) { return it << "*** Ne odgovara pol!"; } class GCena {}; inline ostream& operator<<(ostream& it, const GCena&) { return it << "*** Previsoka cena!"; } class Paketic: public Zbirka<Poklon> { char pol; float dozv, cen; public: Paketic(char p, float d) { pol = p; dozv = d; cen = 0; } Paketic& stavi(Poklon* p) { char pl = p->dohPol(); if (pl!=pol&&pl!='?') throw GPol(); float cn = p->dohCen(); if (cen+cn > dozv) throw GCena(); Zbirka<Poklon>::stavi(p); cen += cn; return *this; } float dohCen() const { return cen; } float dohDozv() const { return dozv; } }; class DedaMraz { public: Paketic* napravi(float max, const Dete& det, Magacin& mag) { char polD = det.dohPol(); Paketic* pak=new Paketic(polD, max); int br = mag.brElem(); for (int i=0; i<br; i++) { Poklon* pok = mag.uzmi(); char polP = pok->dohPol(); if ((polP=='?' || polP==polD) && pak->dohCen() + pok->dohCen() <= pak->dohDozv()) pak->stavi(pok); else mag.stavi(pok); } return pak; } }; int main() { Magacin mag; mag.stavi(new Autic(500)); mag.stavi(new Lutka(450)); mag.stavi(new Autic(600)); mag.stavi(new Ukras(150)); cout << "M:" << mag << endl; Dete dete("Marko",'M'); Paketic* pak(DedaMraz().napravi(1000,dete,mag)); cout << "D:" << dete << endl << "P:" << *pak << endl << "M:" << mag << endl; delete pak; }(⇒ �������)
M:[A.1(500),L.2(450),A.3(600),U.4(150)] D:Marko:M P:[A.1(500),U.4(150)] M:[L.2(450),A.3(600)]
Copyright © 2014, Laslo Kraus
������� �������: 8.2.2014.