Elektrotehnicki fakultet, Beograd  Ласло Краус СИ2ОО1
Други колоквијум
4. 12. 2009.

Аутори: Игор Тартаља и Ласло Краус

Задаци: 1 2 | Напоменe | Решења: 2

Поставка задатка 1 (30 поена) ( почетак)

Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:

а) Која су ограничења за преклапање оператора (), како се позива и која је типична примена?

б) Који је редослед позивања и извршавања конструктора при конструкцији објекта изведене класе, ако и изведена и основна класа садрже класне атрибуте (податке чланове)?

в) Да ли конструктор може бити виртуелна функција и зашто?

Поставка задатка 2 (укупно 70 поена) ( решење | почетак)

Саставити на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни за безбедно коришћење класа; у случају грешке прекидати програм):

(10 поена) Написати на језику C++ програм који направи низ са неколико различитих публикација и затим их испише на стандардном излазу. Користити фиксне параметре (није потребно учитавати податке с главног улаза).


Напоменe ( почетак)


Решење задатка 2 ( поставка | почетак)

#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;

class Publ {
public:
  virtual ~Publ() {}
  virtual const char* naslov() const =0;
  virtual const char* imeLica()  const =0;
private:
  virtual void pisi( ostream& it) const =0;
  friend ostream& operator<<( ostream& it, const Publ& p)
    { p.pisi( it); return it; }
};

class Delo {
  char *nasl, *aut;
  void kopiraj( const Delo& d) {
    nasl = strcpy( new char[strlen(d.nasl)+1], d.nasl);
    aut  = strcpy( new char[strlen(d.aut)+1], d.aut);
  }
  void brisi() { delete [] nasl; delete [] aut; }
public:
  Delo( const char* n, const char* a) {
    nasl = strcpy( new char[strlen(n)+1],n);
    aut  = strcpy( new char[strlen(a)+1],a);
  }
  Delo( const Delo& d) { kopiraj( d); }
  ~Delo() { brisi(); }
  Delo& operator=( const Delo& d) {
    if (this != &d) { brisi(); kopiraj(d); }
    return *this;
  }
  const char* naslov() const { return nasl; }
  const char* autor()  const { return aut;  }
  friend ostream& operator<< (ostream& it, const Delo &d)
    {return it << d.aut << ":" << d.nasl;}
};

class Knjiga: public Publ {
  Delo delo;
  void pisi( ostream& it) const { it << delo << endl; }
public:
  Knjiga( const char* n, const char* a): delo( n, a) {}
  const char* naslov() const { return delo.naslov(); }
  const char* imeLica() const { return delo.autor(); }
};

class Casopis: public Publ {
  Delo** dela;
  int kap, duz;
  char *nasl, *ured;
  void kopiraj( const Casopis& c);
  void brisi();
  void pisi( ostream& it) const;
public:
  Casopis( const char* n, const char* u, int k=10) {
    dela = new Delo* [kap = k];
    duz = 0;
    nasl = strcpy( new char[strlen(n)+1],n);
    ured = strcpy( new char[strlen(u)+1],u);
  }
  Casopis( const Casopis& c) { kopiraj(c); }
  ~Casopis() { brisi(); }
  Casopis& operator=( const Casopis& c) {
    if (this != &c) { brisi(); kopiraj(c); }
    return*this;
  }
  Casopis& operator+=( const Delo& d) {
    if (duz == kap) exit( 1);
    dela[duz++] = new Delo( d);
    return *this;
  }
  const char* naslov() const {return nasl;}
  const char* imeLica() const {return ured;}
};

void Casopis::kopiraj( const Casopis& c) {
  dela = new Delo* [kap = c.kap];
  for (int i=0; i<c.duz; i++) dela[i] = new Delo( *c.dela[i]);
  nasl = strcpy( new char[strlen(c.nasl)+1], c.nasl);
  ured = strcpy( new char[strlen(c.ured)+1], c.ured);
}

void Casopis::brisi() {
  for (int i=0; i<duz; delete dela[i++]);
  delete [] dela;
  delete [] nasl;
  delete [] ured;
}

void Casopis::pisi( ostream& it) const {
  it << nasl << '(' << ured << ')' << endl;
  for (int i=0; i<duz; cout<<*dela[i++]<<endl);
}

int main () {
  Publ** niz = new Publ* [3];
  niz[0] = new Knjiga( "knjiga1", "autor1");
  Casopis* c = new Casopis( "casopis", "urednik", 2);
  *c += Delo( "clanak1", "autor1");
  *c += Delo( "clanak2", "autor2");
  niz[1] = c;
  niz[2] = new Knjiga( "knjiga2", "autor2");
  for (int i=0; i<3; i++) {
    cout << *niz[i] << endl;
    delete niz[i];
  }
  delete [] niz;
  return 0;
}

autor1:knjiga1 casopis(urednik) autor1:clanak1 autor2:clanak2 autor2:knjiga2
( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

Copyright © 2010, Laslo Kraus
Последња ревизија: 3.11.2010.