Ласло Краус |
СИ2ОО1 Други колоквијум 4. 12. 2009. |
---|
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) Која су ограничења за преклапање оператора ()
, како се позива и која је типична примена?
б) Који је редослед позивања и извршавања конструктора при конструкцији објекта изведене класе, ако и изведена и основна класа садрже класне атрибуте (податке чланове)?
в) Да ли конструктор може бити виртуелна функција и зашто?
Саставити на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни за безбедно коришћење класа; у случају грешке прекидати програм):
it<<publ
).
it<<delo
) у засебном реду у облику аутор:
наслов.
casopis+=delo
; грешка је ако се прекорачи капацитет часописа. Приликом писања у излазни ток у првом реду се пише наслов(
уредник)
, после чега се пишу садржана дела.
(10 поена) Написати на језику C++ програм који направи низ са неколико различитих публикација и затим их испише на стандардном излазу. Користити фиксне параметре (није потребно учитавати податке с главног улаза).
#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
Copyright © 2010, Laslo Kraus
Последња ревизија: 3.11.2010.