Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include<string>
- #include<memory>
- #include <list>
- //apstraktna
- class Glas {
- public:
- std::string kandidat;
- bool vazeci;
- Glas(std::string kandidat, bool vazeci) : kandidat(kandidat), vazeci(vazeci) {}
- virtual Glas *DajKopiju() const =0;
- virtual void Ispisi() const = 0;
- };
- class DomaciGlas : public Glas{
- std::string mjesto;
- public:
- DomaciGlas(std::string kandidat, std::string mjesto)
- : Glas(kandidat,true), mjesto(mjesto){}
- Glas *DajKopiju() const override { return new DomaciGlas(*this);}
- void Ispisi() const override {
- std::cout<<kandidat<<", "<<mjesto<<", "<<"Domaci, ";
- if(vazeci == true) std::cout<<"Vazeci" <<std::endl;
- else std::cout<<"Nevazeci"<<std::endl;
- }
- };
- class StraniGlas : public Glas{
- std::string drzava;
- public:
- StraniGlas(std::string kandidat, std::string drzava)
- : Glas(kandidat,true), drzava(drzava){}
- Glas *DajKopiju() const override { return new StraniGlas(*this);}
- void Ispisi() const override {
- std::cout<<kandidat<<", "<<drzava<<", "<<"Strani, ";
- if(vazeci == true) std::cout<<"Vazeci"<<std::endl;
- else std::cout<<"Nevazeci"<<std::endl;
- }
- };
- class Izbori {
- std::list<std::shared_ptr<Glas>> glasovi;
- int godina;
- public:
- Izbori(int godina) : godina(godina) {}
- void Glasaj(std::string JMBG, std::string lokacija, bool domaci) {
- if(domaci==true)
- glasovi.push_back(std::make_shared<DomaciGlas>(JMBG,lokacija));
- else
- glasovi.push_back(std::make_shared<StraniGlas>(JMBG,lokacija));
- }
- void Glasaj(const Glas &glas){
- glasovi.push_back(std::shared_ptr<Glas>(glas.DajKopiju()));
- }
- int DajBrojGlasova() const {
- return glasovi.size();
- }
- void ProglasiNevazecim(int broj){
- int brojac = 0;
- for(auto x : glasovi ){
- brojac++;
- if(brojac == broj){
- (*x).vazeci=false;
- break;
- }
- }
- }
- Glas* operator [](int i){
- auto it = glasovi.begin();
- std::advance(it,i);
- return (*it).get();
- }
- const Glas* operator [](int i) const{
- auto it = glasovi.begin();
- std::advance(it,i);
- return (*it).get();
- }
- Izbori(const Izbori &izb):glasovi(izb.glasovi){
- for(auto x : izb.glasovi){
- glasovi.push_back(std::shared_ptr<Glas>((*x).DajKopiju()));
- }
- }
- Izbori& operator=(const Izbori &izb) {
- glasovi.resize(0);
- for(auto x: izb.glasovi) {
- glasovi.push_back(std::shared_ptr<Glas>((*x).DajKopiju()));
- }
- return *this;
- }
- std::shared_ptr<Glas> operator()(int i){
- auto it = glasovi.begin();
- std::advance(it,i);
- return (*it);
- }
- const std::shared_ptr<Glas> operator()(int i) const{
- auto it = glasovi.begin();
- std::advance(it,i);
- return (*it);
- }
- friend std::ostream &operator<<(std::ostream &tok, const Izbori &izb){
- for(auto x: izb.glasovi){
- x->Ispisi();
- }
- return tok;
- }
- int operator()(std::string JMBG) const{
- int brojac =0;
- for(const auto &x: glasovi){
- if(x->kandidat == JMBG && x->vazeci == true)
- brojac++;
- }
- return brojac;
- }
- };
- int main()
- {
- Izbori izb(2016);
- izb.Glasaj("1205964154961", "Srebrenik", true); // domaći glas
- izb.Glasaj("2111197314131", "Austrija", false); // strani glas
- DomaciGlas dg("0211965154361", "Mostar");
- StraniGlas sg("3001973176522", "Holandija");
- izb.Glasaj(dg);
- izb.Glasaj(sg); // podržati i svaku novu vrstu glasova u budućnosti
- int broj_g = izb.DajBrojGlasova();
- izb.ProglasiNevazecim(2); // glas iz Austrije postaje nevažeći
- const Glas *iz_mostara = izb[2];
- iz_mostara->Ispisi(); // {Za: 3001973176522, Iz: Mostar, Domaci, Vazeci}
- izb(2)->Ispisi(); // {Za: 2111197314131, Iz: Austrija, Strani, Nevazeci}
- Izbori izb2(izb);
- std::cout << izb2; // ispisuje svaki glas u novom redu
- izb2.Glasaj("0211965154361", "Sarajevo", true);
- izb = izb2; // sada i 'izb' ima glas iz Sarajeva (i sve stare)
- int br_gl= izb("3001973176522"); // br. glasova za kandidata (samo važeći glasovi!)
- std::cout<<br_gl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement