|  Ласло Краус | СИ2ОО1 Други колоквијум 7. 12. 2008. | 
|---|
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) У којој ситуацији има смисла преклапање оператора [], колико има операнада, ког типа може да буде његов параметар (формални аргумент) и ког типа би требало да буде његов резултат?
    
б) Да ли се може приступити (1) јавном (2) заштићеном и (3) приватном члану основне класе О у методи m1() заштићено изведене класе I из класе О, и у методи m2() класе II која је јавно изведена из класе I? Одговор дати у табели са врстама: m1, m2 и колонама: 1,2,3.
    
в) Која ограничења постоје у заглављу редефинисане (overriden) виртуелне методе?
Саставити на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни за безбедно коришћење класа; у случају грешке прекидати програм):
it<<osoba) у облику име(тежина).
      it<<vozilo) у облику [возач,сопТеж].
      vozilo+=tezina) и да се истовари (vozilo-=tezina) терет задате тежине (грешка је ако се возило претовари при утовару, односно ако на возилу нема довољно терета при истовару). У излазни ток се пише у облику [возач,сопТеж](товар/носивост).
      vozilo+= putnik; грешка је ако је возило пуно) и да из возила излази путник са датим редним бројем (преостали путници се померају тако да попуне упражњено место; грешка је ако тражени путник не постоји). У излазни ток се пише у облику [возач,сопТеж]{путник|…|путник}.
    (10 поена) Написати на језику C++ програм који направи низ од 2 возила: једног теретног са нешто терета и једног путничког са једним путником и после испише тај низ на главном излазу заједно са њиховим тежинама. Користити константне параметре (не треба ништа учитавати с главног улаза).
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
class Osoba {
  char* imeO;
  float tez;
  void kopiraj( const char* ime, float tez) {
    imeO = new char [strlen (ime)+1];
    strcpy( imeO, ime); this->tez = tez;
  }
  void brisi() { delete imeO; }
public:
  Osoba( const char* ime="", float tez=0) { kopiraj( ime, tez); }
  Osoba( const Osoba& osoba) { kopiraj( osoba.imeO, osoba.tez); }
  ~Osoba() { brisi(); }
  Osoba& operator=( const Osoba& osoba) {
    if (this != &osoba) { brisi(); kopiraj( osoba.imeO, osoba.tez); }
    return *this;
  }
  const char* ime() const { return imeO; }
  float tezina() const { return tez; }
  friend ostream& operator<<( ostream& it, const Osoba& osoba)
    { return it << osoba.imeO << '(' << osoba.tez << ')'; }
};
class Vozilo { float sopTez; Osoba vozac;
  Vozilo( const Vozilo&) {}
  void operator=( const Vozilo&) {}
protected:
  Vozilo( const Osoba& voz, float sopTez) : vozac(voz) { this->sopTez=sopTez; }
  virtual void pisi( ostream& it) const
    { it << '[' << vozac << ',' << sopTez << ']'; }
  friend ostream& operator<<( ostream& it, const Vozilo& v) { v.pisi( it); return it; }
public:
  virtual ~Vozilo() {}
  virtual float tezina() const { return sopTez + vozac.tezina(); }
};
class TVozilo: public Vozilo {
  float nosivost, tovar;
  void pisi( ostream& it) const {
    Vozilo::pisi( it);
    it << '(' << tovar << '/' << nosivost << ')';
  }
public:
  TVozilo( const Osoba& vozac, float sopTez, float nosivost) : Vozilo(vozac,sopTez)
    { this->nosivost=nosivost; tovar=0; }
  TVozilo& operator+=( float tez) {
    if (tovar+tez > nosivost) exit( 1);
    tovar += tez;
    return *this;
  }
  TVozilo& operator-=( float tez) {
    if (tovar-tez < 0) exit( 2);
    tovar -= tez; return *this;
  }
  float tezina() const { return Vozilo::tezina() + tovar; }
};
class PVozilo: public Vozilo {
  Osoba* osobe;
  int kap, brPut;
  void pisi( ostream& it) const;
public:
  PVozilo( const Osoba& vozac, float sopTez, int k) : Vozilo(vozac,sopTez)
    { osobe=new Osoba [kap=k]; brPut=0; }
  ~PVozilo() { delete [] osobe; }
  int brPutnika() const { return brPut; }
  PVozilo& operator+=( const Osoba& putnik) {
    if (brPut == kap) exit( 3);
    osobe[brPut++] = putnik;
    return *this;
  }
  PVozilo& izlaziPutnik( int ind);
  float tezina() const;
};
void PVozilo::pisi( ostream& it) const {
  Vozilo::pisi( it);
  it << '{';
  for (int i=0; i<brPut; i++){ if (i) it << '|'; it << osobe[i]; }
  it << '}';
}
PVozilo& PVozilo::izlaziPutnik( int ind) {
  if (ind<0 || ind>=brPut) exit( 4);
  for (int i=ind+1; i<brPut; i++) osobe[i-1] = osobe[i];
  brPut--;
  return *this;
}
float PVozilo::tezina() const {
  float t = Vozilo::tezina();
  for (int i=0; i<brPut; t+=osobe[i++].tezina());
  return t;
}
int main() {
  TVozilo* tv = new TVozilo( Osoba("Marko",70), 2000, 10000);
  *tv += 5000;
  PVozilo* pv = new PVozilo( Osoba("Milan",66), 750, 4);
  *pv += Osoba( "Zorica", 60);
  Vozilo* vozila[2];
  vozila[0] = tv;
  vozila[1] = pv;
  for (int i=0; i<2; i++) {
    cout << *vozila[i] << " - " << vozila[i]->tezina() << endl;
    delete vozila[i];
  }
  return 0;
}
[Marko(70),2000](5000/10000) - 7070
[Milan(66),750]{Zorica(60)} - 876
  (⇒ почетак)
  
  
    Copyright © 2010, Laslo Kraus
    Последња ревизија: 30.8.2010.