Ласло Краус |
СИ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.